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

时间:2012-09-26 10:58:26

标签: mysql

索引:

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

关系视图:

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)

对此有任何帮助将非常感谢,谢谢。

1 个答案:

答案 0 :(得分:1)

是的,虽然您必须绕过外键约束一次才能插入默认值的虚拟记录,但这是可能的。这是我的工作流程:

这是表创建:

<link href='http://fonts.googleapis.com/css?family=Montserrat:400,700' rel='stylesheet' type='text/css'>

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

<link href='https://fonts.googleapis.com/css?family=Montserrat:400,700' rel='stylesheet' type='text/css'>

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

function ip6_mask2cidr($mask) {
    $s = '';
    if (substr($mask, -1) == ':') $mask .= '0';
    if (substr($mask, 0, 1) == ':') $mask = '0' . $mask;    
    if (strpos($mask, '::') !== false)
        $mask = str_replace('::', str_repeat(':0', 8 - substr_count($mask, ':')).':', $mask);

   foreach(explode(':',$mask) as $oct) {
      // The following two lines, perhaps, superfluous. 
      // I left them because of the paranoia :)
      $oct = trim($oct);
      if ($oct == '') $s .= '0000000000000000';
      else $s .= str_pad(base_convert($oct, 16, 2), 16, '0',  STR_PAD_LEFT);
    }
   return strlen($s) - strlen(rtrim($s, '0'));
}

echo ip6_mask2cidr('ffff:ffff:ffff:ffff::') . "\n"; // 64

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

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)