簡體   English   中英

如何在2個不同的表中強制使用不同的主鍵?

[英]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本身就是代理密鑰,但請看您得到了什么。

  • 超級表包含所有子類型(交易日期,類型(貸方/借方),金額等)通用的數據。
  • 在適當的約束下(您可以使用具有定義的子類型的另一個表),在Super中不能輸入不是正確定義的子類型的條目。
  • 子類型值告訴您哪個子表包含特定於類型的數據。
  • 不能在超級表中未首先創建的子表中進行任何輸入。 並且,一旦定義了子類型,就無法更改-A中的條目在SubType字段中只能有“ A”。 一旦建立FK連接,Super中的“ A”條目也不能更改為“ B”,反之亦然。

如果要在數據庫中強制執行此邏輯,則可能需要另一個表。

如果我了解您的問題,該怎么辦:

  • 付款(paymentID,日期,金額)
  • paymentType(paymentTypeID,paymentID)
  • creditCardPaymentType(creditCardPaymentTypeID,paymentTypeID,cc#,CVV2,到期)
  • paypalPaymentType(paypalPaymentTypeID,paymentTypeID,paypalname,paypalotherinfo等等)

然后使paymentType(paymentID)唯一。

但是在應用程序中執行邏輯可能會更有性能。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM