同一列是否可以将主键和外键约束添加到另一列

Sha*_*500 16 mysql sql foreign-keys

同一列是否可以将主键和外键约束到另一列?

Table1: ID - Primary column, foreign key constraint for Table2 ID
Table2: ID - Primary column, Name 
Run Code Online (Sandbox Code Playgroud)

如果我尝试删除table1数据,这会是一个问题吗?

Delete from table1 where ID=1000;
Run Code Online (Sandbox Code Playgroud)

谢谢.

Dan*_*llo 21

应该没有问题.请考虑以下示例:

CREATE TABLE table2 (
   id int PRIMARY KEY,
   name varchar(20)
) ENGINE=INNODB;

CREATE TABLE table1 (
   id int PRIMARY KEY, 
   t2_id int, 
   FOREIGN KEY (t2_id) REFERENCES table2 (id)
) ENGINE=INNODB;

INSERT INTO table2 VALUES (1, 'First Row');
INSERT INTO table2 VALUES (2, 'Second Row');

INSERT INTO table1 VALUES (1, 1);
INSERT INTO table1 VALUES (2, 1);
INSERT INTO table1 VALUES (3, 1);
INSERT INTO table1 VALUES (4, 2);
Run Code Online (Sandbox Code Playgroud)

表现在包含:

SELECT * FROM table1;
+----+-------+
| id | t2_id |
+----+-------+
|  1 |     1 |
|  2 |     1 |
|  3 |     1 |
|  4 |     2 |
+----+-------+
4 rows in set (0.00 sec)

SELECT * FROM table2;
+----+------------+
| id | name       |
+----+------------+
|  1 | First Row  |
|  2 | Second Row |
+----+------------+
2 rows in set (0.00 sec)
Run Code Online (Sandbox Code Playgroud)

现在我们可以成功删除这样的行:

DELETE FROM table1 WHERE id = 1;
Query OK, 1 row affected (0.00 sec)

DELETE FROM table1 WHERE t2_id = 2;
Query OK, 1 row affected (0.00 sec)
Run Code Online (Sandbox Code Playgroud)

但是,我们将无法删除以下内容:

DELETE FROM table2 WHERE id = 1;
ERROR 1451 (23000): A foreign key constraint fails
Run Code Online (Sandbox Code Playgroud)

如果我们定义外键table1CASCADE选择,我们本来可以删除父,和所有的孩子会得到自动删除:

CREATE TABLE table2 (
   id int PRIMARY KEY,
   name varchar(20)
) ENGINE=INNODB;

CREATE TABLE table1 (
   id int PRIMARY KEY, 
   t2_id int, 
   FOREIGN KEY (t2_id) REFERENCES table2 (id) ON DELETE CASCADE
) ENGINE=INNODB;

INSERT INTO table2 VALUES (1, 'First Row');
INSERT INTO table2 VALUES (2, 'Second Row');

INSERT INTO table1 VALUES (1, 1);
INSERT INTO table1 VALUES (2, 1);
INSERT INTO table1 VALUES (3, 1);
INSERT INTO table1 VALUES (4, 2);
Run Code Online (Sandbox Code Playgroud)

如果我们要重复先前失败的操作DELETE,table1则将删除子行以及父行table2:

DELETE FROM table2 WHERE id = 1;
Query OK, 1 row affected (0.00 sec)

SELECT * FROM table1;
+----+-------+
| id | t2_id |
+----+-------+
|  4 |     2 |
+----+-------+
1 row in set (0.00 sec)

SELECT * FROM table2;
+----+------------+
| id | name       |
+----+------------+
|  2 | Second Row |
+----+------------+
1 row in set (0.00 sec)
Run Code Online (Sandbox Code Playgroud)

  • 如果我错了,请纠正我,但我不知道这是如何回答这个问题的.(以及为什么它被接受了.)问题是询问我们是否可以让同一列具有主键和外键约束到另一列.接受的答案将第二列(t2_id)作为外键引入,它不显示既是主键又是外键的列. (36认同)
  • 我想我会在这里找到答案:/ (5认同)

Jas*_*ark 9

将主键和外键分配给表中的同一列:

create table a1 (
    id1 int not null primary key 
);
insert into a1 values(1),(2),(3),(4);

create table a2 (
    id1 int not null primary key foreign key references a1(id1)
);
insert into a2 values(1),(2),(3);
Run Code Online (Sandbox Code Playgroud)