アドレス テーブルと 1 対多の関係を持つ顧客テーブルがあります。住所を持つ顧客が常に 1 つ (かつ 1 つだけ) の既定の住所を持つように、データベースを制約したいと考えています。
制約を簡単に追加して、顧客ごとにデフォルトのアドレスが 1 つだけになるようにすることができます。ただし、アドレスが常にデフォルトとしてマークされるようにする制約を適用する方法に苦労しています。
要約する:
- 顧客は住所を持っている必要はありません。
- 顧客に住所がある場合は、デフォルトの住所が必要です。
- 顧客ごとに 1 つのデフォルト アドレスのみが存在する必要があります。
問題の例といくつかの「単体」テストを次に示します。リンク テーブルを使用して、顧客と住所を結合しています。
CREATE TABLE Customer
(
Id INT PRIMARY KEY,
Name VARCHAR(100) NOT NULL
)
CREATE TABLE [Address]
(
Id INT PRIMARY KEY,
Address VARCHAR(500) NOT NULL
)
CREATE TABLE CustAddress
(
CustomerId INT,
AddressId INT,
[Default] BIT NOT NULL,
FOREIGN KEY (CustomerId) REFERENCES Customer(Id),
FOREIGN KEY (AddressId) REFERENCES [Address](Id)
)
INSERT INTO Customer VALUES (1, 'Mr Greedy')
INSERT INTO [Address] VALUES (1, 'Roly-Poly House, Fatland')
INSERT INTO [Address] VALUES (2, 'Giant Cottage, A Cave')
-- Should succeed
INSERT INTO CustAddress VALUES (1, 1, 1)
INSERT INTO CustAddress VALUES (1, 2, 0)
DELETE FROM CustAddress
-- Should fail as no default address set
INSERT INTO CustAddress VALUES (1, 1, 0)
DELETE FROM CustAddress
-- Should fail as we end up with no defualt address set
INSERT INTO CustAddress VALUES (1, 1, 1)
INSERT INTO CustAddress VALUES (1, 2, 0)
UPDATE CustAddress SET [Default] = 0 WHERE CustomerId = 1 AND AddressId = 1
DELETE FROM CustAddress
-- Should fail as we end up with no defualt address set
INSERT INTO CustAddress VALUES (1, 1, 1)
INSERT INTO CustAddress VALUES (1, 2, 0)
DELETE FROM CustAddress WHERE CustomerId = 1 AND AddressId = 1