SQL?FOREIGN?KEY約束保障表之間關(guān)系完整性關(guān)鍵規(guī)則詳解
SQL FOREIGN KEY 約束
SQL FOREIGN KEY
約束用于防止破壞表之間關(guān)系的操作。FOREIGN KEY
是一張表中的字段(或字段集合),它引用另一張表中的主鍵。具有外鍵的表稱為子表,具有主鍵的表稱為被引用表或父表。
以下是兩個(gè)表的例子:
Persons 表
PersonID LastName FirstName Age 1 Hansen Ola 30 2 Svendson Tove 23 3 Pettersen Kari 20
Orders 表
OrderID OrderNumber PersonID 1 77895 3 2 44678 3 3 22456 2 4 24562 1
注意,"Orders" 表中的 "PersonID" 列指向 "Persons" 表中的 "PersonID" 列。"Persons" 表中的 "PersonID" 列是 "Persons" 表中的主鍵。"Orders" 表中的 "PersonID" 列是 "Orders" 表中的外鍵。
FOREIGN KEY
約束防止將無效數(shù)據(jù)插入到外鍵列中,因?yàn)樗仨毷歉副碇邪闹抵弧?/p>
在 CREATE TABLE 時(shí)使用 SQL FOREIGN KEY
以下 SQL 在創(chuàng)建 "Orders" 表時(shí)在 "PersonID" 列上創(chuàng)建了一個(gè) FOREIGN KEY
:
對(duì)于 MySQL:
CREATE TABLE Orders ( OrderID int NOT NULL, OrderNumber int NOT NULL, PersonID int, PRIMARY KEY (OrderID), FOREIGN KEY (PersonID) REFERENCES Persons(PersonID) );
對(duì)于 SQL Server / Oracle / MS Access:
CREATE TABLE Orders ( OrderID int NOT NULL PRIMARY KEY, OrderNumber int NOT NULL, PersonID int FOREIGN KEY REFERENCES Persons(PersonID) );
要允許對(duì) FOREIGN KEY
約束進(jìn)行命名,并在多列上定義 FOREIGN KEY
約束,請(qǐng)使用以下 SQL 語法:
對(duì)于 MySQL / SQL Server / Oracle / MS Access:
CREATE TABLE Orders ( OrderID int NOT NULL, OrderNumber int NOT NULL, PersonID int, PRIMARY KEY (OrderID), CONSTRAINT FK_PersonOrder FOREIGN KEY (PersonID) REFERENCES Persons(PersonID) );
在 ALTER TABLE 時(shí)使用 SQL FOREIGN KEY
要在表已經(jīng)創(chuàng)建的情況下在 "PersonID" 列上創(chuàng)建 FOREIGN KEY
約束,請(qǐng)使用以下 SQL:
對(duì)于 MySQL / SQL Server / Oracle / MS Access:
ALTER TABLE Orders ADD FOREIGN KEY (PersonID) REFERENCES Persons(PersonID);
要允許對(duì) FOREIGN KEY
約束進(jìn)行命名,并在多列上定義 FOREIGN KEY
約束,請(qǐng)使用以下 SQL 語法:
對(duì)于 MySQL / SQL Server / Oracle / MS Access:
ALTER TABLE Orders ADD CONSTRAINT FK_PersonOrder FOREIGN KEY (PersonID) REFERENCES Persons(PersonID);
刪除 FOREIGN KEY 約束
要?jiǎng)h除 FOREIGN KEY
約束,請(qǐng)使用以下 SQL:
對(duì)于 MySQL:
ALTER TABLE Orders DROP FOREIGN KEY FK_PersonOrder;
對(duì)于 SQL Server / Oracle / MS Access:
ALTER TABLE Orders DROP CONSTRAINT FK_PersonOrder;
通過這些 SQL 語句,您可以在數(shù)據(jù)庫中定義和管理 FOREIGN KEY
約束,以確保表之間的關(guān)系得到維護(hù)。
SQL CHECK 約束
SQL CHECK
約束用于限制可以放入列中的值范圍。如果在列上定義了 CHECK
約束,它將僅允許為該列指定某些值。如果在表上定義了 CHECK
約束,它可以基于行中其他列的值來限制某些列中的值。
在 CREATE TABLE 時(shí)使用 SQL CHECK
以下 SQL 在創(chuàng)建 "Persons" 表時(shí)在 "Age" 列上創(chuàng)建了一個(gè) CHECK
約束。CHECK
約束確保一個(gè)人的年齡必須是 18 歲或以上:
對(duì)于 MySQL:
CREATE TABLE Persons ( ID int NOT NULL, LastName varchar(255) NOT NULL, FirstName varchar(255), Age int, CHECK (Age>=18) );
對(duì)于 SQL Server / Oracle / MS Access:
CREATE TABLE Persons ( ID int NOT NULL, LastName varchar(255) NOT NULL, FirstName varchar(255), Age int CHECK (Age>=18) );
要允許對(duì) CHECK
約束進(jìn)行命名,并在多列上定義 CHECK
約束,請(qǐng)使用以下 SQL 語法:
對(duì)于 MySQL / SQL Server / Oracle / MS Access:
CREATE TABLE Persons ( ID int NOT NULL, LastName varchar(255) NOT NULL, FirstName varchar(255), Age int, City varchar(255), CONSTRAINT CHK_Person CHECK (Age>=18 AND City='Sandnes') );
在 ALTER TABLE 時(shí)使用 SQL CHECK
要在表已經(jīng)創(chuàng)建的情況下在 "Age" 列上創(chuàng)建 CHECK
約束,請(qǐng)使用以下 SQL:
對(duì)于 MySQL / SQL Server / Oracle / MS Access:
ALTER TABLE Persons ADD CHECK (Age>=18);
要允許對(duì) CHECK
約束進(jìn)行命名,并在多列上定義 CHECK
約束,請(qǐng)使用以下 SQL 語法:
對(duì)于 MySQL / SQL Server / Oracle / MS Access:
ALTER TABLE Persons ADD CONSTRAINT CHK_PersonAge CHECK (Age>=18 AND City='Sandnes');
刪除 CHECK 約束
要?jiǎng)h除 CHECK
約束,請(qǐng)使用以下 SQL:
對(duì)于 SQL Server / Oracle / MS Access:
ALTER TABLE Persons DROP CONSTRAINT CHK_PersonAge;
對(duì)于 MySQL:
ALTER TABLE Persons DROP CHECK CHK_PersonAge;
通過這些 SQL 語句,您可以在數(shù)據(jù)庫中定義和管理 CHECK
約束,以確保列中的值滿足指定的條件。
SQL DEFAULT 約束
SQL DEFAULT
約束用于為列設(shè)置默認(rèn)值。如果沒有指定其他值,將在所有新記錄中添加默認(rèn)值。
在 CREATE TABLE 時(shí)使用 SQL DEFAULT
以下 SQL 在創(chuàng)建 "Persons" 表時(shí)為 "City" 列設(shè)置了 DEFAULT
值:
對(duì)于 MySQL / SQL Server / Oracle / MS Access:
CREATE TABLE Persons ( ID int NOT NULL, LastName varchar(255) NOT NULL, FirstName varchar(255), Age int, City varchar(255) DEFAULT 'Sandnes' );
DEFAULT
約束還可以用于通過使用諸如 GETDATE()
之類的函數(shù)插入系統(tǒng)值:
CREATE TABLE Orders ( ID int NOT NULL, OrderNumber int NOT NULL, OrderDate date DEFAULT GETDATE() );
在 ALTER TABLE 時(shí)使用 SQL DEFAULT
要在表已經(jīng)創(chuàng)建的情況下在 "City" 列上創(chuàng)建 DEFAULT
約束,請(qǐng)使用以下 SQL:
對(duì)于 MySQL:
ALTER TABLE Persons ALTER City SET DEFAULT 'Sandnes';
對(duì)于 SQL Server:
ALTER TABLE Persons ADD CONSTRAINT df_City DEFAULT 'Sandnes' FOR City;
對(duì)于 MS Access:
ALTER TABLE Persons ALTER COLUMN City SET DEFAULT 'Sandnes';
對(duì)于 Oracle:
ALTER TABLE Persons MODIFY City DEFAULT 'Sandnes';
刪除 DEFAULT 約束
要?jiǎng)h除 DEFAULT
約束,請(qǐng)使用以下 SQL:
對(duì)于 MySQL:
ALTER TABLE Persons ALTER City DROP DEFAULT;
對(duì)于 SQL Server / Oracle / MS Access:
ALTER TABLE Persons ALTER COLUMN City DROP DEFAULT;
對(duì)于 SQL Server:
ALTER TABLE Persons ALTER COLUMN City DROP DEFAULT;
通過這些 SQL 語句,您可以在數(shù)據(jù)庫中為列設(shè)置默認(rèn)值,確保在插入新記錄時(shí),如果未提供值,將使用指定的默認(rèn)值。
以上就是SQL FOREIGN KEY約束保障表之間關(guān)系完整性關(guān)鍵規(guī)則詳解的詳細(xì)內(nèi)容,更多關(guān)于SQL FOREIGN KEY約束表完整性的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
mysql中url時(shí)區(qū)的陷阱該如何規(guī)避詳解
最近在工作中發(fā)現(xiàn)一個(gè)問題,是關(guān)于mysql中url時(shí)區(qū)的,發(fā)現(xiàn)這個(gè)陷阱如果大家不注意可能都會(huì)遇到,所以給大家總結(jié)下,這篇文章主要給大家介紹了關(guān)于mysql中url時(shí)區(qū)的陷阱該如何規(guī)避的相關(guān)資料,需要的朋友可以參考借鑒,下面來一起看看吧。2017-08-08MySQL事務(wù)及Spring隔離級(jí)別實(shí)現(xiàn)原理詳解
這篇文章主要介紹了MySQL事務(wù)及Spring隔離級(jí)別實(shí)現(xiàn)原理詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-05-05mysql和oracle默認(rèn)排序的方法 - 不指定order by
這篇文章主要介紹了mysql和oracle默認(rèn)排序的方法 - 不指定order by。具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-07-07詳細(xì)深入聊一聊Mysql中的int(1)和int(11)
mysql數(shù)據(jù)庫作為當(dāng)前常用的關(guān)系型數(shù)據(jù)庫,肯定會(huì)遇到設(shè)計(jì)表的需求,下面對(duì)設(shè)計(jì)表時(shí)int類型的設(shè)置進(jìn)行分析,下面這篇文章主要給大家介紹了關(guān)于Mysql中int(1)和int(11)的相關(guān)資料,需要的朋友可以參考下2022-08-08詳解MySQL 聯(lián)合查詢優(yōu)化機(jī)制
MySQL 使用聯(lián)合的形式的地方會(huì)遠(yuǎn)遠(yuǎn)超過我們過去認(rèn)知的范疇。基本上,它會(huì)認(rèn)為每個(gè)查詢都有聯(lián)合,而不僅僅是從兩張表中查出匹配的數(shù)據(jù)行,這包括了子查詢,甚至僅僅對(duì)單表的 SELECT 操作。因此,理解 MySQL 如何執(zhí)行聯(lián)合十分重要。2021-05-05MySQL數(shù)據(jù)庫存入Date時(shí)天數(shù)會(huì)少一天的問題及解決
這篇文章主要介紹了MySQL數(shù)據(jù)庫存入Date時(shí)天數(shù)會(huì)少一天的問題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-11-11