亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 數據庫 > SQL Server > 正文

SQL Server約束增強的兩點建議

2024-08-31 00:59:50
字體:
來源:轉載
供稿:網友
在許多情況下,對外鍵使用更復雜的邏輯表達式是非常有用的。 此外,在某些情況下能夠在索引視圖創建約束也將非常實用。 我將舉例說明,同時我希望針對此文的投票鏈接會盡快加上。
當外鍵中需要更為復雜的邏輯表達式時
考慮下面的簡單常識: 您的設備的最大電流不能超過您插入到它的電路的最大電流。 假設下面的表存儲電路和設備數據:

復制代碼 代碼如下:


CREATE TABLE Data.Curcuits(CurcuitID INT NOT NULL
CONSTRAINT PK_Curcuits PRIMARY KEY,
MaximumCurrent INT NOT NULL,
Description VARCHAR(100) NOT NULL);
GO
INSERT INTO Data.Curcuits(CurcuitID,
MaximumCurrent,
Description)
SELECT 1, 25, 'Deck and Garage';
GO
CREATE TABLE Data.Devices(DeviceID INT NOT NULL
CONSTRAINT PK_Devices PRIMARY KEY,
CurcuitID INT NULL,
MaximumCurrent INT NOT NULL,
Description VARCHAR(100) NOT NULL,
CONSTRAINT FK_Devices_Curcuits FOREIGN KEY(CurcuitID)
REFERENCES Data.Curcuits(CurcuitID)
);
GO


It would be very convenient to issue a simple command and implement this business rule:
一個非常簡便的命令就可能實現這個業務規則:
ALTER TABLE Data.Devices ADD CONSTRAINT FK_Devices_Curcuits
FOREIGN KEY(CurcuitID, MaximumCurrent)
REFERENCES Data.Curcuits(CurcuitID, MaximumCurrent)
MATCH ON((Data.Devices.CurcuitID = Data.Curcuits.CurcuitID) AND
(Data.Devices.MaximumCurrent <= Data.Curcuits.MaximumCurrent));
However, it is not supported, so I need to use a workaround, one more column and three constraints instead of one, as follows:
然而,該語句并不被支持,所以必須采用其他辦法——多增加一列約束,使用3個而不是1個約束,如下所示:
ALTER TABLE Data.Curcuits
ADD CONSTRAINT UNQ_Curcuits UNIQUE(CurcuitID, MaximumCurrent);
GO
ALTER TABLE Data.Devices ADD CurcuitMaximumCurrent INT NULL;
GO
ALTER TABLE Data.Devices DROP CONSTRAINT FK_Devices_Curcuits;
GO
ALTER TABLE Data.Devices ADD CONSTRAINT FK_Devices_Curcuits
FOREIGN KEY(CurcuitID, CurcuitMaximumCurrent)
REFERENCES Data.Curcuits(CurcuitID, MaximumCurrent)
ON UPDATE CASCADE;
GO
ALTER TABLE Data.Devices
ADD CONSTRAINT CHK_Devices_SufficientCurcuitMaximumCurrent
CHECK(CurcuitMaximumCurrent >= MaximumCurrent);
GO
You can verify that the constraints work:
你可以驗證該約束有效:
INSERT INTO Data.Devices(DeviceID,
CurcuitID,
MaximumCurrent,
CurcuitMaximumCurrent,
Description)
SELECT 1, 1, 50, 25, 'Electric car charger'
Msg 547, Level 16, State 0, Line 1
The INSERT statement conflicted with the CHECK constraint "CHK_Devices_SufficientCurcuitMaximumCurrent". The conflict occurred in database "Test", table "data.Devices".
The statement has been terminated.
INSERT 語句和CHECK約束"CHK_Devices_SufficientCurcuitMaximumCurrent"發生沖突。 該沖突發生在數據庫"Test"的"data.Devices"表。
該語句被終止執行。
As you have seen, the implementation of a very simple and very common business rule is quite involved, because such business rules are not directly supported by the database engine.
可以看出,一個非常簡單而普通的業務規則實現起來也相當繁雜,因為數據庫引擎并不直接支持這種業務規則。
When you want to create constraints on indexed views
在索引視圖上創建約束
Even when your database guarantees that “the maximum current of your device cannot exceed the maximum current of the circuit you plug it into”, it is not good enough. Consider the following sample data:
盡管數據庫保證“您的設備的最大電流不能超過您插入到它的電路的最大電流”,但這還不夠。請看下列示例數據:
INSERT INTO Data.Devices(DeviceID,
CurcuitID,
MaximumCurrent,
CurcuitMaximumCurrent,
Description)
SELECT 2, 1, 15, 25, 'ShopVac';
INSERT INTO Data.Devices(DeviceID,
CurcuitID,
MaximumCurrent,
CurcuitMaximumCurrent,
Description)
SELECT 3, 1, 15, 25, 'Miter Saw';
The database structure allows to plug more than one device into a circuit, which is correct, but if you turn both devices on, their combined maximum current exceeds the circuit's maximum current. To enforce this business rule, it would be natural to create an indexed view, so that the database guarantees that the totals are always correct:
數據庫中的數據表明可以插入一個以上的設備到電路,這沒有錯,可是當所有的設備都打開時,它們的最大電流之和會超過電路最大電流。為了加強這個業務規則,很自然的會創建一個索引視圖以使數據庫保證電流之和總是正確的。
CREATE VIEW Data.TotalMaximumCurrentPerCircuit WITH SCHEMABINDING
AS
SELECT d.CurcuitID,
c.MaximumCurrent AS CircuitMaximumCurrent,
SUM(d.MaximumCurrent) AS TotalMaximumCurrent,
COUNT_BIG(*) AS NumDevices
FROM Data.Devices d JOIN Data.Curcuits c ON d.CurcuitID = c.CurcuitID
GROUP BY d.CurcuitID, c.MaximumCurrent;
GO
CREATE UNIQUE CLUSTERED INDEX Data_TotalMaximumCurrentPerCircuit
ON Data.TotalMaximumCurrentPerCircuit(CurcuitID);
GO
If I could create a check constraint on that indexed view, I would be all set:
如果能在該索引視圖上創建一個約束,我將進行這樣的設置:
ALTER VIEW Data.TotalMaximumCurrentPerCircuit
ADD CONSTRAINT CHK_TotalMaximumCurrentPerCircuit_ValidCurcuit
CHECK(TotalMaximumCurrent <= CircuitMaximumCurrent)
Instead, I need to use triggers or rather contrived kludges. A built in native support for such quite common business rules would increase the usefulness of SQL Server.
實際上,我必須使用觸發器或者精心拼湊Check約束來實現。如果數據庫內置支持這種相當普遍的業務規則,那將會增加SQL Server的實用性 。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲性无码av在线| 亚洲综合在线做性| 国产精品无码专区在线观看| 国产99久久精品一区二区| 97人人模人人爽人人喊中文字| 精品精品国产国产自在线| 国产精品视频导航| 久久久久久久久久久成人| 狠狠躁夜夜躁人人爽超碰91| 色噜噜久久综合伊人一本| 欧美日韩裸体免费视频| 国产日韩在线看片| 国产一区二区日韩精品欧美精品| 久久99热这里只有精品国产| 98精品国产高清在线xxxx天堂| 欧美放荡办公室videos4k| 久久中文字幕在线| 色久欧美在线视频观看| 久久成人精品一区二区三区| 国语自产精品视频在线看一大j8| 国产精品主播视频| 日韩经典中文字幕| 国产精品女主播视频| 最近2019中文字幕大全第二页| 国产精品福利小视频| 国产精品午夜国产小视频| 国产色综合天天综合网| 国产亚洲精品成人av久久ww| 亚洲最大的成人网| 亚洲欧洲中文天堂| 欧美与黑人午夜性猛交久久久| 国产精品三级久久久久久电影| 欧美日韩国产一区中文午夜| 欧美精品久久久久久久| 国产精品美女免费| 亚洲一区二区国产| 国产在线视频不卡| 91中文字幕在线观看| 亚洲欧美制服另类日韩| 亚洲人午夜色婷婷| 日韩成人久久久| 国产亚洲欧美aaaa| 国产精品久久久久一区二区| 欧美激情成人在线视频| 国产成人精品久久亚洲高清不卡| 国产精品黄色av| 欧美激情久久久久久| 国产成一区二区| 久久躁狠狠躁夜夜爽| 亚洲精品成人久久久| 91手机视频在线观看| 国产精品美女在线| 丝袜情趣国产精品| 91久久夜色精品国产网站| 久久久国产精品免费| 亚洲欧美制服综合另类| 91wwwcom在线观看| 91亚洲精品在线| 在线国产精品播放| 色婷婷久久一区二区| 国产亚洲精品美女| 日本一区二区在线免费播放| 亚洲性av在线| 欧美极品美女电影一区| 欧美日韩国产精品专区| 一本大道香蕉久在线播放29| 久久久噜噜噜久久| 一级做a爰片久久毛片美女图片| 亚洲最大的成人网| 日韩精品视频在线| 欧美国产亚洲视频| 97**国产露脸精品国产| 国产精品视频999| 亚洲男人天堂网站| 日韩高清免费观看| 91精品国产亚洲| 91经典在线视频| 日韩专区在线播放| 国产成人精品视| 91精品国产综合久久香蕉最新版| 亚洲精品av在线| 国产日韩视频在线观看| 美女999久久久精品视频| 欧美色视频日本高清在线观看| 久久久国产精品x99av| www.欧美精品一二三区| 亚洲综合精品伊人久久| 午夜欧美大片免费观看| 欧美高清videos高潮hd| 国产精品久久久久高潮| 久热精品视频在线| 国产日韩在线观看av| 992tv成人免费影院| 欧美在线播放视频| 国产日韩中文字幕在线| 国产不卡av在线免费观看| 中日韩美女免费视频网址在线观看| 午夜免费日韩视频| 日韩国产高清污视频在线观看| 中文字幕日韩精品在线| 色999日韩欧美国产| 欧美日韩亚洲国产一区| 亚洲视频视频在线| 91久久国产精品| 91在线视频精品| 国产盗摄xxxx视频xxx69| 自拍亚洲一区欧美另类| 自拍偷拍免费精品| 久久久久久久久综合| 日韩欧美aⅴ综合网站发布| 亚洲激情在线观看| 久久久久久久色| 91精品综合视频| 日韩69视频在线观看| 国产精品日日做人人爱| 久久夜精品香蕉| 亚洲视频第一页| 欧美激情va永久在线播放| 日韩大胆人体377p| 久久av.com| 黄色精品在线看| 午夜精品久久久久久久久久久久久| 亚洲日韩欧美视频| 亚洲欧美日韩精品| 日韩欧美在线免费观看| 久久久久久久久久久成人| 久久精品视频网站| 91视频88av| 午夜精品久久久久久久男人的天堂| 国产精品视频大全| 久久久精品一区| 日韩高清av一区二区三区| 久精品免费视频| 中文字幕亚洲欧美日韩在线不卡| 国产免费久久av| 亚洲国产精品大全| 国产98色在线| 国产精品都在这里| 成人在线小视频| 亚洲美女免费精品视频在线观看| 国产美女精品视频免费观看| 色久欧美在线视频观看| 国产精品一区二区久久国产| 美女扒开尿口让男人操亚洲视频网站| 国精产品一区一区三区有限在线| 日韩一区二区三区在线播放| 午夜精品一区二区三区av| 日韩电影在线观看中文字幕| 一区二区在线视频播放| 在线视频精品一| 欧美大胆在线视频| 亚洲国产小视频| 成人激情在线观看| 亚洲第一精品久久忘忧草社区| 日韩精品小视频| 精品亚洲一区二区三区在线播放| 亚洲自拍中文字幕| 一区二区国产精品视频| 国产亚洲一区二区在线| 久久视频在线免费观看| 亚洲人高潮女人毛茸茸| 亚洲精品免费一区二区三区| 国产日韩在线亚洲字幕中文| 久久视频在线直播|