2011-04-08 54 views
0

我必須構造與列如何實現表約束,使得插入的值不重複的行組僅

COL1(主鍵)COL2(NOT NULL)COL3(NOT NULL)表col4(非空)

現在我需要插入值到這個表,這樣插入到col3的值不會重複在col2的值集......什麼是需要實現的約束? ?...

值可以在col3中作爲一個整體重複...但col3中某些col2值的設置無需重複。 所以這是列名。
IDID_CategoryKeywordsScore

價值觀Keywords列可以重複 - 但在一些ID_Category值,Keywords值不需要重複。 你能幫我實施嗎?

+2

UNIQUE(col2,col3)? – Khez 2011-04-08 09:17:16

+0

如果這不是您所需要的,請更具體地說明一下您的代碼以及您需要的結果。 – Khez 2011-04-08 09:24:10

+0

你是什麼意思,無需重複? – Khez 2011-04-08 09:35:07

回答

1

使用代碼http://forge.mysql.com/wiki/Triggers#Emulating_Check_Constraints

首先創建這個通用錯誤表

CREATE TABLE `Error` (                           
     `ErrorGID` int(10) unsigned NOT NULL auto_increment,                   
     `Message` varchar(128) default NULL,                       
     `Created` timestamp NOT NULL default CURRENT_TIMESTAMP 
     on update CURRENT_TIMESTAMP,           
     PRIMARY KEY (`ErrorGID`),                         
     UNIQUE KEY `MessageIndex` (`Message`)) 
     ENGINE=MEMORY 
     DEFAULT CHARSET=latin1 
     ROW_FORMAT=FIXED 
     COMMENT='The Fail() procedure writes to this table twice to force a constraint failure.'; 

創建失敗的通用功能

DELIMITER $$ 
DROP PROCEDURE IF EXISTS `Fail`$$ 
CREATE PROCEDURE `Fail`(_Message VARCHAR(128)) 
BEGIN 
    INSERT INTO Error (Message) VALUES (_Message); 
    INSERT INTO Error (Message) VALUES (_Message); 
END$$ 
DELIMITER ; 

現在你武裝到任何表創建自定義的約束,比如你的

DELIMITER $$ 
create trigger mytable_check before insert on test.mytable for each row 
begin 
if new.id_category in ('list','of','special','categories') 
    and exists 
     (select * from mytable 
     where id_category=new.id_category 
     and keywords=new.keywords) then 
    call fail(concat('id_category,keywords must be unique when id_category is: ',new.id_category)); 
end if; 
end $$ 
DELIMITER ; 
+0

謝謝...我會試試這個...... – gks 2011-04-08 10:58:28

+0

括號中有什麼值?------------------ new.id_category in('list','of ','special','categories') – gks 2011-04-11 05:19:54

+0

你可以解釋這一行嗎?---- if('list','of','special','categories')中的new.id_category – gks 2011-04-11 05:44:43

相關問題