我需要在同一个表中创建两个属性之间的关系。因此主键和外键都在同一个表中。这里我有一个名为User_Type的表。主键是User_ID。它应该是Parent_ID的外键。
例如:
User_Type
User_ID
User_Name
Parent_ID
User_Type_Division
但是当我创建关系时,我会收到这样的错误。
无法添加或更新子行:外键约束失败 (
mydb
。user_type
,CONSTRAINTParent_User_Type
FOREIGN KEY (Parent_ID
)参考user_type
(User_ID
)无法删除操作 ON UPDATE NO ACTION)“)。
有没有办法可以避免这个错误。请有人告诉我。
在这里,我已经给出了表格的查询。
CREATE TABLE IF NOT EXISTS `user_type` (
`User_ID` int(11) NOT NULL AUTO_INCREMENT,
`User_Name` varchar(45) NOT NULL,
`Parent_ID` int(11) DEFAULT NULL,
`User_Type_Division` varchar(45) DEFAULT NULL,
`User_ID_Format` varchar(45) DEFAULT NULL,
`Data_Entered_Person` varchar(45) DEFAULT NULL,
`Entered_Time` varchar(45) DEFAULT NULL,
PRIMARY KEY (`User_ID`),
UNIQUE KEY `User_Name_UNIQUE` (`User_Name`),
KEY `ParentUserType` (`Parent_ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=2 ;
答案 0 :(得分:1)
仔细检查User_ID
列和Parent_ID
列是否具有相同的数据类型。
此外,您的User_ID
键列设置为NOT NULL,但您的Parent_ID
列设置为null。这可能是问题所在。将Parent_ID
设置为NOT NULL,然后再次尝试创建FK关系。这是我谈论的选项之一。但是,如果您的表中已有数据,这也可能是一个问题。
答案 1 :(得分:1)
有一种方法可以在现有数据上添加和强制执行foreign key
。
第1步 :您需要停止当前会话的外键检查。
SET FOREIGN_KEY_CHECKS=0;
第2步 :将foreign key
添加到您的表格中。
ALTER TABLE myTable
ADD CONSTRAINT fk_name FOREIGN KEY ( columnName ) REFERENCES ...
第3步 :启用外键检查。
SET FOREIGN_KEY_CHECKS=1;
工作示例 :
mysql> create table fkchk( i int not null primary key auto_increment, n int );
Query OK, 0 rows affected (0.26 sec)
mysql> insert into fkchk(n) values ( 0 );
Query OK, 1 row affected (0.10 sec)
mysql> show variables like '%fore%';
+--------------------+-------+
| Variable_name | Value |
+--------------------+-------+
| foreign_key_checks | ON |
+--------------------+-------+
1 row in set (0.00 sec)
mysql> alter table fkchk
> add constraint fk_n foreign key (n) references fkchk(i)
> on delete no action;
ERROR 1452 (23000): Cannot add or update a child row:
a foreign key constraint fails
(`test`.<result 2 when explaining filename '#sql-6fc_14'>,
CONSTRAINT `fk_n` FOREIGN KEY (`n`)
REFERENCES `fkchk` (`i`) ON DELETE NO ACTION)
mysql> SET FOREIGN_KEY_CHECKS=0;
Query OK, 0 rows affected (0.00 sec)
mysql> show variables like '%fore%';
+--------------------+-------+
| Variable_name | Value |
+--------------------+-------+
| foreign_key_checks | OFF |
+--------------------+-------+
1 row in set (0.00 sec)
mysql> alter table fkchk
> add constraint fk_n foreign key (n) references fkchk(i)
> on delete no action;
Query OK, 0 rows affected (0.50 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> insert into fkchk(n) values ( 0 );
Query OK, 1 row affected (0.32 sec)
mysql> select * from fkchk;
+---+------+
| i | n |
+---+------+
| 1 | 0 |
| 2 | 0 |
+---+------+
2 rows in set (0.00 sec)
mysql> SET FOREIGN_KEY_CHECKS=1;
Query OK, 0 rows affected (0.00 sec)
mysql> show variables like '%fore%';
+--------------------+-------+
| Variable_name | Value |
+--------------------+-------+
| foreign_key_checks | ON |
+--------------------+-------+
1 row in set (0.00 sec)
mysql> insert into fkchk(n) values ( 1 );
Query OK, 1 row affected (0.12 sec)
mysql> insert into fkchk(n) values ( 0 );
ERROR 1452 (23000): Cannot add or update a child row:
a foreign key constraint fails
(`test`.`fkchk`,
CONSTRAINT `fk_n` FOREIGN KEY (`n`)
REFERENCES `fkchk` (`i`) ON DELETE NO ACTION)
mysql>
mysql> select * from fkchk;
+---+------+
| i | n |
+---+------+
| 1 | 0 |
| 2 | 0 |
| 3 | 1 |
+---+------+
3 rows in set (0.00 sec)
mysql>