【问题标题】:Connecting two columns in Postgresql在 Postgresql 中连接两列
【发布时间】:2021-09-16 04:32:44
【问题描述】:

我有两个表,当我尝试连接两列时,它显示 >>>“错误:没有唯一约束匹配给定的引用表键”。

第一个表:

CREATE TABLE store(
  course text,  
  name text,
  surname text,
  phone_number varchar 
  id INT PRIMARY KEY
);

第二张桌子:

CREATE TABLE factory_production(
  student_course text,
  school_name,
  id INT PRIMARY KEY
);

所以,我想在 course 和 student_course 之间连接两列。 你能帮我怎么做吗?

【问题讨论】:

  • 为什么两个不同的表使用相同的表名?
  • 我只是写了列名作为例子,不要关注列名。最重要的是在两列中,主键中都有 id。所以,我想连接其他两列,而不是 ids。
  • 但是我们当然关心表名。如果两个表名都是factory_production,并且你说你想连接 course 和 student_course,那就没有意义了。只需单击您的请求下方的编辑按钮并更正此问题。
  • 对不起。我忘了写第一张桌子的名字。例如,商店。
  • 请澄清您的具体问题或提供其他详细信息以准确突出您的需求。正如目前所写的那样,很难准确地说出你在问什么。

标签: sql database postgresql


【解决方案1】:

您有一个课程表。它的主键称为 ID。那么你应该有一个学生表,并且它的主键也应该始终称为 ID。然后你有一个学生课程表,即学生参加的课程。这应该指两个 ID。这是一个建立m:n关系的桥表,因为一个学生可以参加很多课程,而一个课程可以被很多学生参加。

CREATE TABLE course
(
  id INT PRIMARY KEY,
  course_name VARCHAR(50),
  school_name VARCHAR(50)
);

CREATE TABLE student
(
  id INT PRIMARY KEY,
  name VARCHAR(50),
  surname VARCHAR(50),
  phone_number VARCHAR
);

CREATE TABLE student_course
(
  course_id INT,  
  student_id INT,  
  CONSTRAINT fk_student_course_course FOREIGN KEY(course_id) REFERENCES course(id),
  CONSTRAINT fk_student_course_student FOREIGN KEY(student_id) REFERENCES student(id)
);

(附注:您似乎在与不同的学校打交道。是这样吗?那么理想情况下,您还应该有一张学校桌子,并让班级和学生通过学校 ID 引用它。如果学生只能参加他们参加的学校的课程,那么使用复合键可能会有所帮助。)

【讨论】:

    【解决方案2】:

    关于您的问题,有几件事让您难以回答。

    1. CREATE TABLE 命令的语法无效(school_name 缺少类型)
    2. 表名相同,因此也不行,因为名称必须是唯一的
    3. 您没有提供您尝试运行的命令来“连接”两列。

    不过,根据列的命名,我会将您的 CREATE TABLE 语句调整为如下所示:

    CREATE TABLE courses (
      course_name text,
      school_name text,
      id INT PRIMARY KEY
    );
    
    CREATE TABLE students (
      course text,  
      name text,
      surname text,
      phone_number varchar,
      id INT PRIMARY KEY
    );
    

    然而,让您的表模式排列起来还需要做一件事。通常,您不会在students 表中包含course 列。相反,您将通过 ID 列上的连接在两者之间进行引用。所以有了这个,你的创建表语句会更像:

    CREATE TABLE courses (
      course_name text,
      school_name text,
      id INT PRIMARY KEY
    );
    
    CREATE TABLE students (
      course_id int,
      name text,
      surname text,
      phone_number varchar,
      id INT PRIMARY KEY
    );
    

    现在您可以通过JOIN 命令“连接”这两个表。比如:

    SELECT *
    FROM students
    LEFT JOIN courses ON students.course_id = courses.id
    

    您应该得到一个输出,该输出为您提供学生行和课程表中匹配的课程行信息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-09-10
      • 2018-02-28
      • 2020-09-13
      • 2011-08-07
      • 1970-01-01
      • 2014-05-31
      • 2020-12-04
      • 1970-01-01
      相关资源
      最近更新 更多