2013-03-10 21 views
1

哪些約束可以確保某列中輸入了一些值?我很困惑主鍵和非空約束。哪些約束可以確保某列中輸入了一些值?

+0

Null是結構化查詢語言(SQL)中用於指示數據值不存在於數據庫中的特殊標記。有關更多詳細信息,請參閱此部分[空(SQL)](http://en.wikipedia。org/wiki/Null_(SQL)) – 2013-03-10 21:04:15

+0

PRIMARY KEY約束唯一標識數據庫表中的每條記錄。主鍵必須包含唯一值。取自[SQL PRIMARY KEY Constraint](http://www.w3schools.com/sql/sql_primarykey.asp) – 2013-03-10 21:06:47

+0

NOT NULL約束強制列不接受NULL值。取自[SQL NOT NULL Constraint](http://www.w3schools.com/sql/sql_notnull.asp) – 2013-03-10 21:09:11

回答

3

一個NOT NULL約束。

參與PK的所有列也必須不允許NULL,但PK約束保證了更多的唯一性 - 即表中沒有兩行可以具有相同的主鍵值。

在SQL Server中,即使語法上您可以在DDL中命名爲NOT NULL約束,但它不同於其他約束,因爲實際上沒有爲約束本身存儲元數據(包括名稱)。

CREATE TABLE T 
(
X INT CONSTRAINT NotNull NOT NULL 
) 
+0

我們生活和學習:我從來沒有意識到'NOT NULL'在語法上是一個約束! – 2013-03-10 21:15:46

0
NOT NULL 

是條件是一個字段具有一個值。您可以強制爲每個插入或更新的記錄始終輸入一個值,使表定義中的字段不爲NULL。

主鍵必須滿足這三個條件:

  1. 字段的值是NOT NULL。
  2. 這些值是唯一的。
  3. 的值是不可變的。

數據庫可以使用唯一索引(以及該字段上的非空條件)強制執行前兩個條件。

第三個條件沒有通常由數據庫執行。數據庫通常會允許更改主鍵字段,因此DBA可以「修復」它們。因此,第三個條件更具哲理性,因爲您同意使用密鑰進行身份識別,而不是編寫更改值的應用程序,除非旨在讓管理員修復密鑰。

我已經使用字段在這裏,但主鍵可以是一個複合主鍵,由滿足條件的字段的任意組合的。任何匹配前2個或全部3個條件的字段組合稱爲候選鍵。

只有一個候選鍵,可以使用作爲主鍵。哪一個只是一個任意的選擇。

+2

SQL Server不強制您的列表中的項目3。 – 2013-03-10 21:11:15

+1

@MartinSmith DB2,Oracle或MySQL都不是。我懷疑通常的做法是讓條件3不受數據庫的強制。然而,條件3是關係數據庫理論定義的一部分。 – 2013-03-10 21:17:42

+1

我明白你的觀點,但穩定性似乎比不變性更廣泛地被引用。 [請參閱此處的示例答案](http://stackoverflow.com/q/3632726/73226) – 2013-03-10 21:22:20

1

還有一點,我沒有看到解決的:NULL和空字符串是兩個完全不同的事情,但他們往往被社會的很大一部分認爲可以互換。

可以聲明一個varcharNOT NULL但你仍然可以做到這一點:

DECLARE @x TABLE(y VARCHAR(32) NOT NULL); 

INSERT @x(y) VALUES(''); 

所以,如果你的目標是確保有既不是NULL也不零長度的有效值字符串,你也可以添加一個檢查約束,例如

DECLARE @x TABLE(y VARCHAR(32) NOT NULL CHECK (DATALENGTH(LTRIM(y)) > 0)); 
+0

@MartinSmithTouché謝謝 – 2013-03-10 23:28:03

相關問題