外键和同一表中的主键

时间:2013-12-11 05:53:01

标签: mysql

我需要在同一个表中创建两个属性之间的关系。因此主键和外键都在同一个表中。这里我有一个名为User_Type的表。主键是User_ID。它应该是Parent_ID的外键。

例如:

User_Type 
User_ID
User_Name
Parent_ID
User_Type_Division

但是当我创建关系时,我会收到这样的错误。

  

无法添加或更新子行:外键约束失败   (mydbuser_type,CONSTRAINT Parent_User_Type FOREIGN KEY   (Parent_ID)参考user_typeUser_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 ;

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>