【问题标题】:How to use two primary keys into one foreign key? [closed]如何将两个主键变成一个外键? [关闭]
【发布时间】:2014-02-17 08:12:33
【问题描述】:
mysql>   CREATE TABLE guests (
   ->   id int(11) NOT NULL AUTO_INCREMENT,
   ->   first_name varchar(55) DEFAULT NULL,
   ->   last_name  varchar(55) DEFAULT NULL,
   ->   email varchar(100) DEFAULT NULL,
   ->   role_type int(4) DEFAULT 4,
   ->   start_date  date,
   ->   expiry_date date,
   ->   reason blob,
   ->   added_by int(4) NOT NULL REFERENCES super_admins(id),
   ->   password_digest varchar(255) DEFAULT NULL,
   ->   remember_token date DEFAULT NULL,
   ->   primary key(id),
   ->   CONSTRAINT fk_guests FOREIGN KEY(added_by) REFERENCES super_admins(id),
   ->   CONSTRAINT fk_guests1 FOREIGN KEY (added_by) REFERENCES admin(id)
   -> );

【问题讨论】:

  • 您的问题不清楚。但是从您的问题标题来看:根据主键的定义,您不能有两个主键
  • @AlmaDo 我认为他正在尝试使用来自不同表的 2 个主键创建复合键。
  • CREATE TABLE super_admins ( id int(11) NOT NULL AUTO_INCREMENT, first_name varchar(55) DEFAULT NULL, last_name varchar(55) DEFAULT NULL, email varchar(100) DEFAULT NULL, role_type int(4)默认0,主键(id));
  • CREATE TABLE 管理员(id int(11) NOT NULL AUTO_INCREMENT, first_name varchar(55) DEFAULT NULL, last_name varchar(55) DEFAULT NULL, email varchar(100), role_type int(4) DEFAULT 1 , 主键 (id) );
  • 这是我要链接的两个表以创建一个链接,该链接是谁使用外键添加了此访客帐户链接

标签: mysql relational-database entity-relationship relationship


【解决方案1】:

称为多态关系(关联)。而且您不能拥有同时引用两个父表的列(在您的情况下为added_by)。但是,为了能够使用外键约束,您可以做的是拥有两个可为空的列 added_by_super_adminadded_by_admin,其中只有一个将保存每条记录的值。

CREATE TABLE guests 
(
  id INT(11) NOT NULL AUTO_INCREMENT,
  first_name VARCHAR(55) DEFAULT NULL,
  last_name  VARCHAR(55) DEFAULT NULL,
  email VARCHAR(100) DEFAULT NULL,
  role_type INT(4) DEFAULT 4,
  start_date  DATE,
  expiry_date DATE,
  reason blob,
  added_by_super_admin INT(4) NULL,
  added_by_admin INT(4) NULL,
  password_digest VARCHAR(255) DEFAULT NULL,
  remember_token DATE DEFAULT NULL,
  PRIMARY KEY(id),
  CONSTRAINT fk_guests  FOREIGN KEY (added_by_super_admin) REFERENCES super_admins(id),
  CONSTRAINT fk_guests1 FOREIGN KEY (added_by_admin) REFERENCES admin(id)
);

然后在查询中你可以做

SELECT ...
       COALESCE(s.id, a.id) added_by_id,
       COALESCE(s.name, a.name) added_by_name,
       ...
  FROM guests g LEFT JOIN super_admins s
    ON g.added_by_super_admin = s.id LEFT JOIN admin
    ON g.added_by_admin = a.id

【讨论】:

  • 您发布的查询上方显示此错误消息 ERROR 1005 (HY000): Can't create table 'backjobs.guests' (errno: 150)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-02
  • 2017-07-05
  • 1970-01-01
  • 1970-01-01
  • 2012-06-29
相关资源
最近更新 更多