gpt4 book ai didi

mysql - 自引用外键 - mysql 未设置为空

转载 作者:可可西里 更新时间:2023-11-01 06:34:02 24 4
gpt4 key购买 nike

索引:

Keyname    Type   Unique  Packed  Column     Cardinality Collation  Null        
parent_id BTREE No No parent_id 1 A YES

表:(评论)

Column      Type        Null    Default Extra
id int(11) No None AUTO_INCREMENT
parent_id int(11) Yes NULL

关系 View :

Column     Foreign key constraint (INNODB)
parent_id 'test_site'.'comments'.'id' ON DELETE CASCADE ON UPDATE NO ACTION

parent_id 是否可以不设置为 NULL。我已尝试将默认值设置为“0”并插入值“0”,但出现以下错误。

错误:

SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update 
a child row: a foreign key constraint fails (`test_site`.`comments`,
CONSTRAINT `comments_ibfk_2` FOREIGN KEY (`parent_id`) REFERENCES `comments`
(`id`) ON DELETE CASCADE ON UPDATE NO ACTION)

如有任何帮助,我们将不胜感激,谢谢。

最佳答案

是的,这是可能的,尽管您只需绕过外键约束一次即可为默认值插入虚拟记录。这是我的工作流程:

这是表的创建:

root@localhost:playground > create table comments(id int auto_increment primary key, parent_id int not null default 0, constraint fk_parent_id foreign key (parent_id) references comments(id) on delete cascade on update cascade)engine=innodb;
Query OK, 0 rows affected (0.01 sec)

root@localhost:playground > show create table comments\G
*************************** 1. row ***************************
Table: comments
Create Table: CREATE TABLE `comments` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`parent_id` int(11) NOT NULL DEFAULT '0',
PRIMARY KEY (`id`),
KEY `fk_parent_id` (`parent_id`),
CONSTRAINT `fk_parent_id` FOREIGN KEY (`parent_id`) REFERENCES `comments` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=latin1
1 row in set (0.00 sec)

现在规避外键并插入虚拟记录。

root@localhost:playground > set session foreign_key_checks=0;
Query OK, 0 rows affected (0.00 sec)

root@localhost:playground > insert into comments (id) values (null); Query OK, 1 row affected (0.00 sec)

root@localhost:playground > set session foreign_key_checks=1;
Query OK, 0 rows affected (0.00 sec)

root@localhost:playground > select * from comments;
+----+-----------+
| id | parent_id |
+----+-----------+
| 1 | 0 |
+----+-----------+
1 row in set (0.00 sec)

root@localhost:playground > update comments set id = 0 where id = 1;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0

root@localhost:playground > select * from comments;
+----+-----------+
| id | parent_id |
+----+-----------+
| 0 | 0 |
+----+-----------+
1 row in set (0.00 sec)

为了让事情变得整洁,我重置了 auto_increment(这不是必需的):

root@localhost:playground > alter table comments auto_increment=0;
Query OK, 0 rows affected (0.01 sec)
Records: 0 Duplicates: 0 Warnings: 0

从现在开始,您的外键约束将正常工作,并且您的列不再可以为空并具有默认值:

root@localhost:playground > insert into comments (id) values (null);
Query OK, 1 row affected (0.00 sec)

root@localhost:playground > select * from comments;
+----+-----------+
| id | parent_id |
+----+-----------+
| 0 | 0 |
| 1 | 0 |
+----+-----------+
2 rows in set (0.00 sec)

关于mysql - 自引用外键 - mysql 未设置为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12600182/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com