我正在創建一個表,我需要一個檢查約束來驗證給定字串值的可能值。我正在創建這張表:
CREATE TABLE cat_accident (
acc_type VARCHAR(30) NOT NULL CHECK(acc_type = 'Home accident' OR acc_type = 'Work accident'),
acc_descrip VARCHAR(30) NOT NULL
);
所以基本上我想驗證 acc_type 是否等于家庭事故,然后 acc_descrip 可以是或“中毒”或“燒傷”或“廚房傷口”,或者如果 acc_type 等于工傷事故,那么 acc_descrip 可以是或“凍結”或'電刑'。
我該如何撰寫該約束?
uj5u.com熱心網友回復:
使用CHECK帶有CASE運算式的約束:
CREATE TABLE cat_accident (
acc_type VARCHAR(30) NOT NULL,
acc_descrip VARCHAR(30) NOT NULL
CHECK(
CASE acc_type
WHEN 'Home accident' THEN acc_descrip IN ('Intoxication', 'burns', 'Kitchen wound')
WHEN 'Work accident' THEN acc_descrip IN ('freezing', 'electrocution')
END
)
);
請參閱演示。
uj5u.com熱心網友回復:
我建議使用查找表來實作這一點:
CREATE TABLE l_accident_description(
description_id VARCHAR(5) PRIMARY KEY,
description_full VARCHAR(30) NOT NULL UNIQUE,
location VARCHAR(30)
);
INSERT INTO l_accident_description
(description_id,description_full,location)
VALUES
('INTOX','Intoxication','Home Accident'),
('BURNS','Burns','Home Accident'),
('K_WND','Kitchen wound','Home Accident'),
('FREEZ','Freezing','Work Accident'),
('ELECT','Electrocution','Work Accident');
這樣,您可以將要編碼的關系編碼為cat_accident,但如果細節發生變化,只需在查找表中插入/洗掉/更新行即可。此實作具有額外的好處,即您不會在表中重復存盤盡可能多的資料(只是VARCHAR(5)代碼而不是VARCHAR(30)字串)。然后表結構變為(添加了主鍵):
CREATE TABLE cat_accident (
cat_accident_id PRIMARY KEY,
acc_descrip VARCHAR(5) NOT NULL REFERENCES l_accident_description(description_id)
);
任何時候您想知道是否意外家庭/作業,這可以通過加入查找表的查詢來完成。加入查找表更多的是本著良好的資料庫構建的精神,而不是對可能隨著資料庫增長而輕松更改或變得更復雜的表進行硬編碼檢查。
事實上,理想的解決方案可能是在這里創建兩個查找表,l_accident_description依次參考位置查找,但為了簡單起見,我已經展示了如何使用一個來完成它。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/406859.html
標籤:
