[英]How to enforce different primary keys in 2 different tables?
我可能在這里錯過了一些簡單的東西,但似乎找不到答案。
我有兩個從另一個繼承的實體,我想強制要求子實體在數據庫中不能具有彼此相同的鍵,而不能與查詢具有相同的鍵。
例如,我希望信用卡或貝寶具有與付款相同的主鍵,但是我只希望它既包含信用卡又包含貝寶,而不是同時存在於兩者中。 因此,付款是信用卡或支付寶,但不能同時使用兩者。
我雖然是簡單的約束,但類似:
check (cc.transaction != pp.transaction)
但這在mysql工作台中似乎不起作用。 有任何想法嗎?
我發現實際上檢查在mySQL中根本不起作用,因此我需要使用觸發器,但是沒有辦法只取消插入操作,因此必須拋出錯誤才能退出。 我正在使用支持觸發器的mySQL Workbench,但不接受我嘗試的任何觸發器,例如:
CREATE DEFINER = CURRENT_USER TRIGGER `ddi`.`tcredit_card_BEFORE_INSERT`
BEFORE INSERT ON `tcredit_card` FOR EACH ROW
BEGIN
IF EXISTS (SELECT Paypal_ID FROM tPaypal WHERE Paypal_ID = NEW.Card_ID) THEN
SIGNAL SQLSTATE '02000' SET MESSAGE_TEXT = 'Cannot have multiple payments.';
END IF;
END;
無論我做什么,它總是說存在和錯誤,包括嘗試更改定界符,這也會出現錯誤。 現在,除了砸碎旋轉的珍妮,使用紙質記錄和一匹馬車之外,肯定有某種方法可以起作用嗎? (無需更改數據庫架構)
您可以在數據庫中具有超類型和子類型的排列,將它們分開很容易。 只需將子類型聲明為超級鍵的一部分,然后在子表中強制使用類型值即可。
只要有可能,就讓底層系統中內置的約束和檢查強制實施您實現的任何設計。
create table Super(
ID int not null auto_increment,
SubType char( 1 ) not null check( SubType in( 'A', 'B' ) ),
...
constraint PK_Super primary key( ID, SubType )
);
create table subA(
SubAID int not null,
SubType char( 1 ) not null default 'A' check( SubType = 'A' ),
... -- data specific to Type = A
constraint PK_SubA primary key( SubAID, SubType ),
constraint FK_SubA_Super foreign key( SubAID, SubType )
references Super( ID, SubType )
);
create table subB(
SubBID int not null,
SubType char( 1 ) not null default 'B' check( SubType = 'B' ),
... -- data specific to Type = B
constraint PK_SubB primary key( SubBID, SubType ),
constraint FK_SubB_Super foreign key( SubBID, SubType )
references Super( ID, SubType )
);
將Super.SubType包含在PK中似乎是多余的,因為Super.ID本身就是代理密鑰,但請看您得到了什么。
如果要在數據庫中強制執行此邏輯,則可能需要另一個表。
如果我了解您的問題,該怎么辦:
然后使paymentType(paymentID)唯一。
但是在應用程序中執行邏輯可能會更有性能。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.