英文:
Add foreign key to the existing table diesel Rust
问题
我有两张现有的表格:user_table和post。我需要建立这两张表格之间的关系,即将user_id
添加到post表格中。
我有以下的迁移代码:
ALTER TABLE post
ADD CONSTRAINT fk_post_user_id
FOREIGN KEY (user_id)
REFERENCES user_table (id);
数据库结构:
diesel::table! {
post (id) {
id -> Int4,
title -> Nullable<Varchar>,
content -> Nullable<Varchar>,
date -> Timestamp,
user_id -> Int4,
}
}
diesel::table! {
user_table (id) {
id -> Int4,
username -> Varchar,
email -> Varchar,
password -> Varchar,
}
}
diesel::joinable!(post -> user_table (user_id));
diesel::allow_tables_to_appear_in_same_query!(
post,
user_table,
);
我自己添加的这两行代码:
diesel::joinable!(post -> user_table (user_id));
user_id -> Int4
我的post和user模型:
#[derive(Queryable, Identifiable, Associations)]
#[belongs_to(User)]
#[table_name="post"]
pub struct Post {
pub id: i32,
pub title: String,
pub content: String,
pub user_id: i32
}
#[derive(Queryable, Identifiable, Clone)]
#[table_name="user_table"]
pub struct User {
pub id: i32,
pub username: String,
pub email: String,
pub password: String,
}
创建表格的SQL查询:
CREATE TABLE user_table (
id SERIAL PRIMARY KEY,
username VARCHAR NOT NULL UNIQUE,
email VARCHAR NOT NULL UNIQUE,
password VARCHAR NOT NULL
);
CREATE TABLE post (
id SERIAL PRIMARY KEY,
title VARCHAR,
content VARCHAR,
date timestamp NOT NULL DEFAULT NOW()
);
我遇到了一个迁移错误:
列"user_id"在外键约束中引用,但不存在
我是后端开发的新手,卡在了这个问题上。非常感谢任何支持。
英文:
I have two existing tables: user_table and post. I need to make the relation between these two tables i.e. add user_id
to the post table.
I have the following migration
ALTER TABLE post
ADD CONSTRAINT fk_post_user_id
FOREIGN KEY (user_id)
REFERENCES user_table (id);
Schema
diesel::table! {
post (id) {
id -> Int4,
title -> Nullable<Varchar>,
content -> Nullable<Varchar>,
date -> Timestamp,
user_id -> Int4,
}
}
diesel::table! {
user_table (id) {
id -> Int4,
username -> Varchar,
email -> Varchar,
password -> Varchar,
}
}
diesel::joinable!(post -> user_table (user_id));
diesel::allow_tables_to_appear_in_same_query!(
post,
user_table,
);
These two lines I added by myself
diesel::joinable!(post -> user_table (user_id));
user_id -> Int4
My post and user models
#[derive(Queryable, Identifiable, Associations)]
#[belongs_to(User)]
#[table_name="post"]
pub struct Post {
pub id: i32,
pub title: String,
pub content: String,
pub user_id: i32
}
#[derive(Queryable, Identifiable, Clone)]
#[table_name="user_table"]
pub struct User {
pub id: i32,
pub username: String,
pub email: String,
pub password: String,
}
SQL queries for creating tables
CREATE TABLE user_table (
id SERIAL PRIMARY KEY,
username VARCHAR NOT NULL UNIQUE,
email VARCHAR NOT NULL UNIQUE,
password VARCHAR NOT NULL
);
CREATE TABLE post (
id SERIAL PRIMARY KEY,
title VARCHAR,
content VARCHAR,
date timestamp NOT NULL DEFAULT NOW()
);
I am getting a migration error
> column "user_id" referenced in foreign key constraint does not exist
I am new to the backend development and I am stuck with this problem.
Would be grateful for any support
答案1
得分: 1
关于您的迁移问题:
ALTER TABLE post
ADD CONSTRAINT fk_post_user_id
FOREIGN KEY (user_id)
REFERENCES user_table (id);
这基本上是在现有的列 user_id
上创建一个外键约束,该约束引用了另一个表,但是 user_id
列不存在。您可以通过在迁移之前添加 ALTER TABLE posts ADD COLUMN user_id INTEGER;
来解决这个问题,以创建 user_id
列。
英文:
The issue in with your migration:
ALTER TABLE post
ADD CONSTRAINT fk_post_user_id
FOREIGN KEY (user_id)
REFERENCES user_table (id);
This basically says create a foreign key constraint on the existing column user_id
that references the other table, but the user_id
column does not exist. You can fix that by adding a ALTER TABLE posts ADD COLUMN user_id INTEGER;
to your migration before creating the foreign key.
答案2
得分: 0
将user_id
直接添加到posts
表中:
CREATE TABLE user_table (
id SERIAL PRIMARY KEY,
username VARCHAR NOT NULL UNIQUE,
email VARCHAR NOT NULL UNIQUE,
password VARCHAR NOT NULL
);
CREATE TABLE post (
id SERIAL PRIMARY KEY,
title VARCHAR,
content VARCHAR,
user_id INT,
date timestamp NOT NULL DEFAULT NOW()
);
如果设置了此模式,外键约束将起作用。
请记得删除迁移(删除表)并重新运行迁移。
如果你的表中有一些数据,请小心,如果你删除表,数据将丢失。
英文:
I would suggest directly adding user_id
To posts
table:
CREATE TABLE user_table (
id SERIAL PRIMARY KEY,
username VARCHAR NOT NULL UNIQUE,
email VARCHAR NOT NULL UNIQUE,
password VARCHAR NOT NULL
);
CREATE TABLE post (
id SERIAL PRIMARY KEY,
title VARCHAR,
content VARCHAR,
user_id INT,
date timestamp NOT NULL DEFAULT NOW()
);
The FK constraint will work if this schema is set.
Remember to drop migrations ( drop the tables) and re-run the migrations.
Be careful if you have some data in your tables. If you drop a table data will be lost.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论