当前位置: 首页 > 知识库问答 >
问题:

postgresql外键语法

后烨煜
2023-03-14

我有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中创建外键的正确方法是什么?

共有1个答案

商宏爽
2023-03-14

假设这张表:

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