我有2个表,你会在下面的posgresql代码中看到。第一个表格学生有2列,一列student_name,另一列student_id主键。在我的第二张测试表中,它有4列,subject_id,subject_name,然后是highestStudent_id中分数最高的学生。我试图让highestStudent_id参考我学生表中的student_id。这是我下面的代码,我不确定语法是否正确:
CREATE TABLE students ( student_id SERIAL PRIMARY KEY,
player_name TEXT);
CREATE TABLE tests ( subject_id SERIAL,
subject_name,
highestStudent_id SERIAL REFERENCES students);
语法highest student\u id SERIAL REFERENCES students
正确吗?因为我看到了另一个类似于highest student\u id REFERENCES student(student\u id))
请问,在postgresql中创建外键的正确方法是什么?
假设这张表:
CREATE TABLE students
(
student_id SERIAL PRIMARY KEY,
player_name TEXT
);
定义外键有四种不同的方法(处理单列PK时),它们都会导致相同的外键约束:
>
内联而不提及目标列:
CREATE TABLE tests
(
subject_id SERIAL,
subject_name text,
highestStudent_id integer REFERENCES students
);
内联提及目标列:
CREATE TABLE tests
(
subject_id SERIAL,
subject_name text,
highestStudent_id integer REFERENCES students (student_id)
);
创建表中的行外部分
:
CREATE TABLE tests
(
subject_id SERIAL,
subject_name text,
highestStudent_id integer,
constraint fk_tests_students
foreign key (highestStudent_id)
REFERENCES students (student_id)
);
作为单独的alter表
语句:
CREATE TABLE tests
(
subject_id SERIAL,
subject_name text,
highestStudent_id integer
);
alter table tests
add constraint fk_tests_students
foreign key (highestStudent_id)
REFERENCES students (student_id);
你喜欢哪一个取决于你的品味。但是你的脚本应该是一致的。如果外键引用由多个列组成的PK,则最后两条语句是唯一的选项-在这种情况下,您不能定义FK“inline”,例如外键(a,b)引用foo(x,y)
如果您不喜欢Postgres生成的系统名称,只有版本3)和4)可以为FK约束定义自己的名称。
串行
数据类型不是真正的数据类型。它只是一个简写符号,用于定义从序列中获取的列的默认值。因此,引用定义为serial
的列的任何列都必须使用适当的基类型integer
(或bigserial
列的bigint
)
问题内容: 在PostgreSQL中,我有一个数据库,我打算进行以下表声明: 一切正常,除了在创建最后一个表(更正)时出现以下错误: 错误:没有唯一的约束匹配给定键的引用表“提交” 我对更正表的打算是对每个提交都有唯一的更正,但是一个提交可以(也可以不)具有更正。 我该如何解决这个错误?是设计问题还是表声明错误? 问题答案: 外键约束不关心所引用的列是否在引用另一列本身。但是引用的列 必须 是唯一
问题内容: 我有两个像这样的表: 因此,逻辑很简单,用户删除了类别x下的所有书籍,从猫中删除了x之后,我尝试了上述方法,但不起作用,在我清理了表格书籍后,表格类别仍被填充,这是怎么回事? 问题答案: 具有级联删除功能的外键意味着,如果删除父表中的记录,则子表中的相应记录将被自动删除。这称为级联删除。 您说的是相反的意思,这不是当您从子表中删除时会将记录从父表中删除。 ON DELETE CAS
所以我有一个表,它用一个昵称作为外键,用一个id作为主键: 到目前为止,一切都很好。然而,每当我试图从发布中获取主键时,它告诉我:“没有唯一的约束来匹配引用表“信息”的给定键。 但是,如果我将表中的信息信息ID更改为唯一,错误就会消失。这是正确的做事方式吗? 提前感谢大家!
当我要执行这段代码时,我会收到以下错误消息: 您的SQL语法有错误;请查看与您的MySQL server版本相对应的手册,以了解使用“add CONSTRAINTFOREIGN KEY在第11行引用`pay_s'时使用的正确语法 但我不明白问题所在。感谢您的帮助!
问题内容: 我有一个用户表,例如: 和一张有工作的桌子: 可以将作业分配给用户,但只能分配给超级用户。其他用户无法分配作业。 因此,我有一个表格,通过它可以查看将哪个作业分配给了哪个用户: 但是我想创建一个检查约束,该约束引用具有的用户。 那可能吗?还是有其他解决方案? 问题答案: 这将适用于INSERTS: 然后在user_has_job表上检查约束: 适用于插入物: 但是,这是可能的: 因此,
我有两张桌子: null null null null 我不知道现在该做什么(一些脚本?)。我需要将表列中的值更改为表列中的相应值。 如果太混乱,我会试着举一个正常数据的例子: 表1中的行(oldprimarykey、sometext、newprimarykey): null null