在 T-SQL 中,通常最好命名您創建的所有約束,包括檢查約束。
alter table mytable with check
add constraint myconstraint check (mycol > 0)
如果您不提供明確的名稱 ( myconstraint),那么服務器將為您生成一個唯一的名稱,該名稱在錯誤訊息中不是特別可讀。
或者每個人都這么說。但是甚至有可能為檢查約束獲得這個生成的名稱嗎?我已經看到它用于外鍵約束和唯一約束,但我不知道如何在不指定名稱的情況下創建檢查約束。
如果我myconstraint在上面的 T-SQL 中省略了名稱,這是一個語法錯誤。
我問的原因是在 tempdb 中檢查約束。臨時表的名稱是每個會話的,所以呼叫你的 table 沒有問題#x。您可以在多個不同的程式(或同時運行的同一程式的多個實體)中使用該名稱,并且它們不會發生沖突。只有全域臨時表 (as ##x) 需要具有全域唯一名稱。
但是,約束名稱在 tempdb 中必須是唯一的,并且不是每個會話的。因此,如果您給它們一個可讀的名稱,您將面臨在其他連接中與相同名稱發生沖突的風險。您需要做一些事情以使其在全球范圍內獨一無二,要么在客戶端粘貼一些垃圾,要么使用動態 SQL。我非常希望不指定名稱并讓服務器處理命名約束的作業,就像我在臨時表上創建唯一索引時已經發生的那樣。
如何在不指定名稱的情況下進行檢查約束?
Microsoft SQL Server 2016 (SP2-CU15-GDR) (KB4583461) - 13.0.5865.1 (X64)
uj5u.com熱心網友回復:
也許您的語法錯誤(您沒有向我們展示)。簡單地
ALTER TABLE elbat
WITH CHECK
ADD CHECK (nmuloc = 1);
應該可以正常作業,SQL Server 將生成一個名稱。
uj5u.com熱心網友回復:
當您顯式創建 a 時,CONSTRAINT您必須指定一個名稱。當您CONSTRAINT隱式創建一個時,您會得到一個具有自動名稱的名稱。
采取以下 DDL 陳述句:
CREATE TABLE dbo.MyTable (ID int IDENTITY PRIMARY KEY,
SomeDate date DEFAULT GETDATE(),
SomeInt int DEFAULT 1 CHECK (SomeInt> 0));
上面創建了一個表,有 3 列,但也有4 個 CONSTRAINTs。這些約束是:
- 主鍵約束
ID - 默認約束
SomeDate - 上的默認約束
SomeInt, - 上的檢查約束
SomeInt。
我們可以通過查看sys物件來驗證這一點:
SELECT N'Key Constraint', [name] AS ConstraintName
FROM sys.key_constraints kc
WHERE parent_object_id = OBJECT_ID(N'dbo.MyTable')
UNION ALL
SELECT N'Default Constraint', [name] AS ConstraintName
FROM sys.default_constraints
WHERE parent_object_id = OBJECT_ID(N'dbo.MyTable')
UNION ALL
SELECT N'Check Constraint', [name] AS ConstraintName
FROM sys.check_constraints
WHERE parent_object_id = OBJECT_ID(N'dbo.MyTable');
當我運行它時,生成的名稱是:
| 約束型別 | 約束名稱 |
|---|---|
| 鍵約束 | PK__MyTable__3214EC27B4E6D2B3 |
| 默認約束 | DF__MyTable__SomeDat__6A33284E |
| 檢查約束 | CK__MyTable__SomeInt__6B274C87 |
這并不意味著您在創建CONSTRAINT表的 DDL時不能顯式提供名稱。如果要將它們定義為列的一部分,則如下所示:
CREATE TABLE dbo.OtherTable (ID int IDENTITY CONSTRAINT PK_OtherTable PRIMARY KEY,
SomeDate date CONSTRAINT DF_OtherTable_SomeDate DEFAULT GETDATE(),
SomeInt int CONSTRAINT DF_OtherTable_SomeInt DEFAULT 1
CONSTRAINT chk_OtherTable_SomeInt CHECK (SomeInt> 0));
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/407799.html
標籤:
上一篇:在控制臺中顯示串列項
下一篇:在T-SQL中即時轉義單引號
