創建外鍵時可以指定級聯刪除選項,設置後主表數據被刪除,從表數據也會被刪除,反之則不然。
參考:http://hi..com/zagelover/item/c0118adda8f92ef592a97475
sql外鍵約束NO ACTION,CASCADE,SET NULL,SET DEFAULT
NO ACTION
指定如果試圖刪除/修改某一行,而該行的鍵被其他表的現有行中的外鍵所引用,則產生錯誤並回滾 DELETE/UPDATE語句。
CASCADE、SET NULL 和 SET DEFAULT
允許通過刪除或更新鍵值來影響指定具有外鍵關系的表,這些外鍵關系可追溯到在其中進行修改的表。如果為目標表也定義了級聯引用操作,那麼指定的級聯操作也將應用於刪除或更新的那些行。不能為具有 timestamp 列的外鍵或主鍵指定 CASCADE。
ON DELETE CASCADE
指定如果試圖刪除某一行,而該行的鍵被其他表的現有行中的外鍵所引用,則也將刪除所有包含那些外鍵的行。
ON UPDATE CASCADE
指定如果試圖更新某一行中的鍵值,而該行的鍵值被其他表的現有行中的外鍵所引用,則組成外鍵的所有值也將更新到為該鍵指定的新值。 (如果 timestamp 列是外鍵或被引用鍵的一部分,則不能指定 CASCADE。 )
ON DELETE SET NULL
指定如果試圖刪除某一行,而該行的鍵被其他表的現有行中的外鍵所引用,則組成被引用行中的外鍵的所有值將被設置為 NULL。目標表的所有外鍵列必須可為空值,此約束才可執行。
ON UPDATE SET NULL
指定如果試圖更新某一行,而該行的鍵被其他表的現有行中的外鍵所引用,則組成被引用行中的外鍵的所有值將被設置為 NULL。目標表的所有外鍵列必須可為空值,此約束才可執行。
ON DELETE SET DEFAULT
指 定如果試圖刪除某一行,而該行的鍵被其他表的現有行中的外鍵所引用,則組成被引用行中的外鍵的所有值將被設置為它們的默認值。目標表的所有外鍵列必須具 有默認值定義,此約束才可執行。如果某個列可為空值,並且未設置顯式的默認值,則會使用 NULL 作為該列的隱式默認值。因 ON DELETE SET DEFAULT 而設置的任何非空值在主表中必須有對應的值,才能維護外鍵約束的有效性。
ON UPDATE SET DEFAULT
指 定如果試圖更新某一行,而該行的鍵被其他表的現有行中的外鍵所引用,則組成被引用行中的外鍵的所有值將被設置為它們的默認值。目標表的所有外鍵列必須具 有默認值定義,此約束才可執行。如果某個列可為空值,並且未設置顯式的默認值,則會使用 NULL 作為該列的隱式默認值。因 ON UPDATE SET DEFAULT 而設置的任何非空值在主表中必須有對應的值,才能維護外鍵約束的有效性。
2. mysql中用sql語句怎麼修改一個表的外鍵,從NO ACTION變成CASCADE
. cascade方式
在父表上update/delete記錄時,同步update/delete掉子表的匹配記錄
. set null方式
在父表上update/delete記錄時,將子表上匹配記錄的列設為null
要注意子表的外鍵列不能為not null
. No action方式
如果子表中有匹配的記錄,則不允許對父表對應候選鍵進行update/delete操作
. Restrict方式
同no action, 都是立即檢查外鍵約束
. Set default方式
父表有變更時,子表將外鍵列設置成一個默認的值 但Innodb不能識別
3. 資料庫如果外鍵是NO_ACTION 的關系還有必要設置外鍵嗎
ON DELETE { NO ACTION | CASCADE | SET NULL | SET DEFAULT }
指定如果已創建表中的行具有引用關系,並且被引用行已從父表中刪除,則對這些行採取的操作。默認值為 NO ACTION。
NO ACTION
資料庫引擎將引發錯誤,並回滾對父表中行的刪除操作。
CASCADE
如果從父表中刪除一行,則將從引用表中刪除相應行。
SET NULL
如果父表中對應的行被刪除,則組成外鍵的所有值都將設置為 NULL。若要執行此約束,外鍵列必須可為空值。
SET DEFAULT
如果父表中對應的行被刪除,則組成外鍵的所有值都將設置為默認值。若要執行此約束,所有外鍵列都必須有默認定義。如果某個列可為空值,並且未設置顯式的默認值,則將使用 NULL 作為該列的隱式默認值。
4. 詳解如何定義SQL Server外關鍵字約束
SQL Server外關鍵字約束定義了表之間的關系。當一個表中的一個列或多個列的組合和其它表中的主關鍵字定義相同時,就可以將這些列或列的組合定義為外關鍵字,並設定它適合哪個表中哪些列相關聯。這樣,當在定義SQL Server主關鍵字約束的表中更新列值,時其它表中有與之相關聯的外關鍵字約束的表中的外關鍵字列也將被相應地做相同的更新。外關鍵字約束的作用還體現在,當向含有外關鍵字的表插入數據時,如果與之相關聯的表的列中無與插入的外關鍵字列值相同的值時,系統會拒絕插入數據。與主關鍵字相同,不能使用一個定義為TEXT 或IMAGE 數據類型的列創建外關鍵字。外關鍵字最多由16 個列組成。
定義外關鍵字約束的語法如下:
以下是代碼片段:
CONSTRAINT constraint_name
FOREIGN KEY (column_name1[, column_name2,…,column_name16])
REFERENCES ref_table [ (ref_column1[,ref_column2,…, ref_column16] )]
[ ON DELETE { CASCADE | NO ACTION } ]
[ ON UPDATE { CASCADE | NO ACTION } ] ]
[ NOT FOR REPLICATION ]
各參數說明如下:
REFERENCES
指定要建立關聯的表的信息。
ref_table
指定要建立關聯的表的名稱。
ref_column
指定要建立關聯的表中的相關列的名稱。
以下是代碼片段:
ON DELETE {CASCADE | NO ACTION}
指定在刪除表中數據時,對關聯表所做的相關操作。在子表中有數據行與父表中的對應數據行相關聯的情況下,如果指定了值CASCADE,則在刪除父表數據行時會將子表中對應的數據行刪除;如果指定的是NO ACTION,則SQL Server 會產生一個錯誤,並將父表中的刪除操作回滾。NO ACTION 是預設值。
以下是代碼片段:
ON UPDATE {CASCADE | NO ACTION}
指定在更新表中數據時,對關聯表所做的相關操作。在子表中有數據行與父表中的對應數據行相關聯的情況下,如果指定了值CASCADE,則在更新父表數據行時會將子表中對應的數據行更新;如果指定的是NO ACTION,則SQL Server 會產生一個錯誤,並將父表中的更新操作回滾。NO ACTION 是預設值。
以下是代碼片段:
NOT FOR REPLICATION
指定列的外關鍵字約束在把從其它表中復制的數據插入到表中時不發生作用。
希望可以幫到你,謝謝!
5. ON DELETE NO ACTION 什麼意思
ON DELETE NO ACTION
指定如果試圖刪除某一行,而該行的鍵被其他表的現有行中的外鍵所引用,則產生錯誤並回滾 DELETE 語句。
6. 幫我解釋下SQL建表命令的意思(翻譯,詳細點謝謝大哥OR大姐)
參數
database_name
是要在其中創建表的資料庫名稱。database_name 必須是現有資料庫的名稱。如果不指定資料庫,database_name 默認為當前資料庫。當前連接的登錄必須在 database_name 所指定的資料庫中有關聯的現有用戶 ID,而該用戶 ID 必須具有創建表的許可權。
owner
是新表所有者的用戶 ID 名,owner 必須是 database_name 所指定的資料庫中的現有用戶 ID,owner 默認為與 database_name 所指定的資料庫中的當前連接相關聯的用戶 ID。如果 CREATE TABLE 語句由 sysadmin 固定伺服器角色成員或 database_name 所指定的資料庫中的 db_dbowner 或 db_ddladmin 固定資料庫角色成員執行,則 owner 可以指定與當前連接的登錄相關聯的用戶 ID 以外的其它用戶 ID。如果與執行 CREATE TABLE 語句的登錄相關聯的用戶 ID 僅具有創建表的許可權,則 owner 必須指定與當前登錄相關聯的用戶 ID。sysadmin 固定伺服器角色成員或別名為 dbo 用戶的登錄與用戶 ID dbo 相關聯;因此,由這些用戶創建的表的默認所有者為 dbo。不是由上述兩種角色的登錄創建的表所有者默認為與該登錄相關聯的用戶 ID。
table_name
是新表的名稱。表名必須符合標識符規則。資料庫中的 owner.table_name 組合必須唯一。table_name 最多可包含 128 個字元,但本地臨時表的表名(名稱前有一個編號符 #)最多隻能包含 116 個字元。
column_name
是表中的列名。列名必須符合標識符規則,並且在表內唯一。以 timestamp 數據類型創建的列可以省略 column_name。如果不指定 column_name,timestamp 列的名稱默認為 timestamp。
computed_column_expression
是定義計算列值的表達式。計算列是物理上並不存儲在表中的虛擬列。計算列由同一表中的其它列通過表達式計算得到。例如,計算列可以這樣定義:cost AS price * qty。表達式可以是非計算列的列名、常量、函數、變數,也可以是用一個或多個運算符連接的上述元素的任意組合。表達式不能為子查詢。
計算列可用於選擇列表、WHERE 子句、ORDER BY 子句或任何其它可使用常規表達式的位置,但下列情況除外:
計算列不能用作 DEFAULT 或 FOREIGN KEY 約束定義,也不能與 NOT NULL 約束定義一起使用。但是,如果計算列由具有確定性的表達式定義,並且索引列中允許計算結果的數據類型,則可將該列用作索引中的鍵列,或用作 PRIMARY KEY 或 UNIQUE 約束的一部分。
例如,如果表中含有整型列 a 和 b,則可以在計算列 a+b 上創建索引。但不能在計算列 a+DATEPART(dd, GETDATE()) 上創建索引,因為在以後的調用中,其值可能發生改變。
計算列不能作為 INSERT 或 UPDATE 語句的目標。
說明 表中計算列所使用的列值因行而異,因此每行的計算列值可能不同。
計算列的為空性是由 SQL Server 根據使用的表達式自動確定的。即使只有不可為空的列,大多數表達式的結果也認為是可為空的,因為可能的下溢或溢出也將生成 NULL 結果。使用 COLUMNPROPERTY 函數(AllowsNull 屬性)查看錶中任何計算列的為空性。通過指定 ISNULL(check_expression, constant),其中常量為替代任何 NULL 結果的非 NULL 值,可為空的表達式 expr 可以轉換為不可為空的表達式。
ON {filegroup | DEFAULT}
指定存儲表的文件組。如果指定 filegroup,則表將存儲在指定的文件組中。資料庫中必須存在該文件組。如果指定 DEFAULT,或者根本未指定 ON 參數,則表存儲在默認文件組中。
ON {filegroup | DEFAULT} 也可以在 PRIMARY KEY 約束或 UNIQUE 約束中指定。這些約束會創建索引。如果指定 filegroup,則索引將存儲在指定的文件組中。如果指定 DEFAULT,則索引將存儲在默認文件組中。如果約束中沒有指定文件組,則索引將與表存儲在同一文件組中。如果 PRIMARY KEY 約束或 UNIQUE 約束創建聚集索引,則表的數據頁將與索引存儲在同一文件組中。
說明 在 ON {filegroup | DEFAULT} 和 TEXTIMAGE_ON {filegroup | DEFAULT} 的上下文中,DEFAULT 並不是關鍵字。DEFAULT 是默認文件組的標識符並需對其進行定界,如 ON "DEFAULT"、ON [DEFAULT] 和 TEXTIMAGE_ON "DEFAULT" 或 TEXTIMAGE_ON [DEFAULT]。
TEXTIMAGE_ON
是表示 text、ntext 和 image 列存儲在指定文件組中的關鍵字。如果表中沒有 text、ntext 或 image 列,則不能使用 TEXTIMAGE ON。如果沒有指定 TEXTIMAGE_ON,則 text、ntext 和 image 列將與表存儲在同一文件組中。
data_type
指定列的數據類型。可以是系統數據類型或用戶定義數據類型。用戶定義數據類型必須先用 sp_addtype 創建,然後才能在表定義中使用。
在 CREATE TABLE 語句中,用戶定義數據類型的 NULL/NOT NULL 賦值可被替代。但長度標准不能更改;不能在 CREATE TABLE 語句中指定用戶定義數據類型的長度。
DEFAULT
如果在插入過程中未顯式提供值,則指定為列提供的值。DEFAULT 定義可適用於除定義為 timestamp 或帶 IDENTITY 屬性的列以外的任何列。除去表時,將刪除 DEFAULT 定義。只有常量值(如字元串)、系統函數(如 SYSTEM_USER())或 NULL 可用作默認值。為保持與 SQL Server 早期版本的兼容,可以給 DEFAULT 指派約束名。
constant_expression
是用作列的默認值的常量、NULL 或系統函數。
IDENTITY
表示新列是標識列。當向表中添加新行時,Microsoft® SQL Server™ 將為該標識列提供一個唯一的、遞增的值。標識列通常與 PRIMARY KEY 約束一起用作表的唯一行標識符。可以將 IDENTITY 屬性指派給 tinyint、smallint、int、bigint、decimal(p,0) 或 numeric(p,0) 列。對於每個表只能創建一個標識列。不能對標識列使用綁定默認值和 DEFAULT 約束。必須同時指定種子和增量,或者二者都不指定。如果二者都未指定,則取默認值 (1,1)。
seed
是裝入表的第一行所使用的值。
increment
是添加到前一行的標識值的增量值。
NOT FOR REPLICATION
表示當復制登錄(如 sqlrepl)向表中插入數據時,不強制 IDENTITY 屬性。復制的行必須保留發布資料庫中所賦予的鍵值;NOT FOR REPLICATION 子句確保不向復制進程所插入的行賦予新的標識值。其它登錄所插入的行仍然具有以通常的方式創建的新標識值。建議同時使用具有 NOT FOR REPLICATION 的 CHECK 約束,以確保賦予的標識值處於當前資料庫所需的范圍內。
ROWGUIDCOL
表示新列是行的全局唯一標識符列。對於每個表只能指派一個 uniqueidentifier 列作為 ROWGUIDCOL 列。ROWGUIDCOL 屬性只能指派給 uniqueidentifier 列。如果資料庫兼容級別小於或等於 65,則 ROWGUIDCOL 關鍵字無效。有關更多信息,請參見 sp_dbcmptlevel。
ROWGUIDCOL 屬性並不強制列中所存儲值的唯一性。該屬性也不會為插入到表中的新行自動生成值。若要為每列生成唯一值,那麼或者在 INSERT 語句中使用 NEWID 函數,或者將 NEWID 函數指定為該列的默認值。
collation_name
指定列的排序規則。排序規則名稱既可以是 Windows 排序規則名稱,也可以是 SQL 排序規則名稱。collation_name 僅適用於數據類型為 char、varchar、text、nchar、nvarchar 及 ntext 的列。如果沒有指定該參數,那麼如果列的數據類型是用戶定義的,則該列的排序規則就是用戶定義數據類型的排序規則,否則就是資料庫的默認排序規則。
有關 Windows 和 SQL 排序規則名稱的更多信息,請參見 COLLATE。
CONSTRAINT
是可選關鍵字,表示 PRIMARY KEY、NOT NULL、UNIQUE、FOREIGN KEY 或 CHECK 約束定義的開始。約束是特殊屬性,用於強制數據完整性並可以為表及其列創建索引。
constrain_name
是約束的名稱。約束名在資料庫內必須是唯一的。
NULL | NOT NULL
是確定列中是否允許空值的關鍵字。從嚴格意義上講,NULL 不是約束,但可以使用與指定 NOT NULL 同樣的方法指定。
PRIMARY KEY
是通過唯一索引對給定的一列或多列強制實體完整性的約束。對於每個表只能創建一個 PRIMARY KEY 約束。
UNIQUE
是通過唯一索引為給定的一列或多列提供實體完整性的約束。一個表可以有多個 UNIQUE 約束。
CLUSTERED | NONCLUSTERED
是表示為 PRIMARY KEY 或 UNIQUE 約束創建聚集或非聚集索引的關鍵字。PRIMARY KEY 約束默認為 CLUSTERED,UNIQUE 約束默認為 NONCLUSTERED。
在 CREATE TABLE 語句中只能為一個約束指定 CLUSTERED。如果在為 UNIQUE 約束指定 CLUSTERED 的同時又指定了 PRIMARY KEY 約束,則 PRIMARY KEY 將默認為 NONCLUSTERED。
[ WITH FILLFACTOR = fillfactor ]
指定 SQL Server 存儲索引數據時每個索引頁的充滿程度。用戶指定的 fillfactor 取值范圍從 1 到 100。如果沒有指定 fillfactor,則默認為 0。創建索引時,fillfactor 的值越低,不必分配新空間即可由新索引項使用的空間就越多。
FOREIGN KEY...REFERENCES
是為列中的數據提供引用完整性的約束。FOREIGN KEY 約束要求列中的每個值在被引用表中對應的被引用列中都存在。FOREIGN KEY 約束只能引用被引用表中為 PRIMARY KEY 或 UNIQUE 約束的列或被引用表中在 UNIQUE INDEX 內引用的列。
ref_table
是 FOREIGN KEY 約束所引用的表名。
(ref_column[,...n])
是 FOREIGN KEY 約束所引用的表中的一列或多列。
ON DELETE {CASCADE | NO ACTION}
指定當要創建的表中的行具有引用關系,並且從父表中刪除該行所引用的行時,要對該行採取的操作。默認設置為 NO ACTION。
如果指定 CASCADE,則從父表中刪除被引用行時,也將從引用表中刪除引用行。如果指定 NO ACTION,SQL Server 將產生一個錯誤並回滾父表中的行刪除操作。
例如,在 Northwind 資料庫中,Orders 表和 Customers 表之間有引用關系。Orders.CustomerID 外鍵引用 Customers.CustomerID 主鍵。
如果對 Customers 表的某行執行 DELETE 語句,並且為 Orders.CustomerID 指定 ON DELETE CASCADE 操作,則 SQL Server 將在 Orders 表中檢查是否有與被刪除的行相關的一行或多行。如果存在相關行,則 Orders 表中的相關行將隨 Customers 表中的被引用行一同刪除。
反之,如果指定 NO ACTION,若在 Orders 表中至少有一行引用 Customers 表中要刪除的行,則 SQL Server 將產生一個錯誤並回滾 Customers 表中的刪除操作。
ON UPDATE {CASCADE | NO ACTION}
指定當要創建的表中的行具有引用關系,並且在父表中更新該行所引用的行時,要對該行採取的操作。默認設置為 NO ACTION。
如果指定 CASCADE,則在父表中更新被引用行時,也將在引用表中更新引用行。如果指定 NO ACTION,SQL Server 將產生一個錯誤並回滾父表中的行更新操作。
例如,在 Northwind 資料庫中,Orders 表和 Customers 表之間有引用關系:Orders.CustomerID 外鍵引用 Customers.CustomerID 主鍵。
如果對 Customers 表的某行執行 UPDATE 語句,並且為 Orders.CustomerID 指定 ON UPDATE CASCADE 操作,則 SQL Server 將在 Orders 表中檢查是否有與被更新行相關的一行或多行。如果存在相關行,則 Orders 表中的相關行將隨 Customers 表中的被引用行一同更新。
反之,如果指定 NO ACTION,若在 Orders 表中至少有一行引用 Customers 行,則 SQL Server 將產生一個錯誤並回滾對 Customers 行的更新操作。
CHECK
是通過限制可輸入到一列或多列中的可能值強制域完整性的約束。
NOT FOR REPLICATION
是用於防止在復制所使用的分發過程中強制 CHECK 約束的關鍵字。當表是復制發布的訂戶時,請不要直接更新訂閱表,而要更新發布表,然後讓復制進程將數據分發回訂閱表。可以在訂閱表上定義 CHECK 約束,以防用戶修改訂閱表。但是如果不使用 NOT FOR REPLICATION 子句,CHECK 約束同樣會防止復制進程將修改從發布表分發給訂閱表。NOT FOR REPLICATION 子句表示對用戶的修改(而不是對復制進程)強加約束。
NOT FOR REPLICATION CHECK 約束適用於被更新記錄的前像和後像,以防在復制范圍中添加記錄或從復制范圍中刪除記錄。將檢查所有刪除和插入操作;如果操作在復制范圍內,則拒絕執行該操作。
如果對標識符列使用此約束,則當復制用戶更新標識列時,SQL Server 將允許不必重新計算表標識列的種子值。
logical_expression
是返回 TRUE 或 FALSE 的邏輯表達式。
column
是用括弧括起來的一列或多列,在表約束中表示這些列用在約束定義中。
[ASC | DESC]
指定加入到表約束中的一列或多列的排序次序。默認設置為 ASC。
n
是表示前面的項可重復 n 次的佔位符。
7. 在sqlserver中 如果從表中只有主表的主鍵中其中一列欄位名的話能不能在從表中建立外鍵如果能的話怎麼建
從表外鍵的欄位名稱不一定要與主表主鍵名稱一致,但類型必須一致。
但是從表中都沒與主表相對應的欄位那就不能建立外鍵約束了。
建立外鍵的前提: 本表的列必須與外鍵類型相同(外鍵必須是外表主鍵)。
外鍵作用: 使兩張表形成關聯,外鍵只能引用外表中的列的值!
指定主鍵關鍵字: foreign key(列名)
引用外鍵關鍵字: references <外鍵表名>(外鍵列名)
事件觸發限制: on delete和on update , 可設參數cascade(跟隨外鍵改動), restrict(限制外表中的外鍵改動),set Null(設空值),set Default(設默認值),[默認]no action
例如:
outTable表 主鍵 id 類型 int
創建含有外鍵的表:
create table temp(
id int,
name char(20),
foreign key(id) references outTable(id) on delete cascade on update cascade);
說明:把id列 設為外鍵 參照外表outTable的id列 當外鍵的值刪除 本表中對應的列篩除 當外鍵的值改變 本表中對應的列值改變。
8. sql中的 no action 與cascade
http://www.webjx.com/database/sqlserver-6924.htm
先爬後飛