2012-06-15 206 views
0

在我的分貝此插入失敗 -主鍵和外鍵衝突

insert into tig_pairs (pkey, pval, uid) select 'schema-version', '4.0', uid from tig_users where (sha1_user_id = sha1(lower('db-properties'))); 
ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`tigasedb`.`tig_pairs`, CONSTRAINT `tig_pairs_constr_2` FOREIGN KEY (`nid`) REFERENCES `tig_nodes` (`nid`)) 

如果表定義是:

create table if not exists tig_pairs (
    nid int unsigned, 
    uid int unsigned NOT NULL, 

    pkey varchar(255) NOT NULL,  
    pval mediumtext, 

    PRIMARY KEY (nid, pkey),  --  *** 
      key pkey (pkey), 
     key uid (uid), 
     key nid (nid), 
     constraint tig_pairs_constr_1 foreign key (uid) references tig_users (uid), 
     constraint tig_pairs_constr_2 foreign key (nid) references tig_nodes (nid) 
) 
ENGINE=InnoDB default character set utf8 ROW_FORMAT=DYNAMIC; 

create table if not exists tig_nodes (
    nid int unsigned NOT NULL auto_increment, 
    parent_nid int unsigned, 
    uid int unsigned NOT NULL, 

    node varchar(255) NOT NULL, 

    primary key (nid), 
    unique key tnode (parent_nid, uid, node), 
    key node (node), 
     key uid (uid), 
     key parent_nid (parent_nid), 
     constraint tig_nodes_constr foreign key (uid) references tig_users (uid) 
) 
ENGINE=InnoDB default character set utf8 ROW_FORMAT=DYNAMIC; 

PRIMARY KEY (nid, pkey), -- ***被忽略,那麼我的查詢經過很好。該主鍵與令人不安的外鍵約束之間是否存在衝突?我怎樣才能避免它?主鍵必須留在:)

謝謝!

編輯:

nid int unsigned NOT NULL auto_increment, 

回答

2

你有你的tig_pairs表引用tig_nodes表的外約束:得到了通過改變在一行中tig_pairs定義擺脫錯誤的。但是,您並未將任何數據插入到nid字段中。引用字段tig_nodes.nid不允許NULL值。由於這兩個約束,您不能將空值插入字段tig_pairs

也看到這個問題:MySQL foreign key to allow NULL?

編輯:也,主鍵的值永遠不會允許爲空;所以只要nid包含在該主鍵中,就不能使其成爲NULL。

+0

+1。非常好的解釋 – DonCallisto

+0

呃...... spot on.Now,你能告訴我如何解決這個問題嗎?這***線是額外的(即不是原來的程序員認爲這一切),它必須留在那裏。如果PK不能爲空,那麼我猜想有很多查詢和服務器邏輯需要改變[gulp]。任何快捷方式? – kellogs

+0

我不完全知道表格的目的是什麼;但不改變它們的結構..你可能可以在'tig_nodes'表中放置一些「默認」的值,並在'tig_pairs'中使用它的ID作爲'nid'的默認值? – Yhn