SQL學習筆記8
SQL FOREIGN KEY 約束
一個表中的 FOREIGN KEY 指向另一個表中的 UNIQUE KEY(唯一約束的鍵)。
FOREIGN KEY 約束用於預防破壞表之間連線的行為。
FOREIGN KEY 約束也能防止非法資料插入外來鍵列,因為它必須是它指向的那個表中的值之一。
下面的 SQL 在 "Orders" 表建立時在 "P_Id" 列上建立 FOREIGN KEY 約束:
MySQL:
CREATE TABLE Orders(
O_Id int NOT NULL,
OrderNo int NOT NULL,
P_Id int,
PRIMARY KEY (O_Id),
FOREIGN KEY (P_Id) REFERENCES Persons(P_Id)
)
SQL Server / Oracle / MS Access:
CREATE TABLE Orders(
O_Id int NOT NULL PRIMARY KEY,
OrderNo int NOT NULL,
P_Id int FOREIGN KEY REFERENCES Persons(P_Id)
)
如需命名 FOREIGN KEY 約束,並定義多個列的 FOREIGN KEY 約束,請使用下面的 SQL 語法:
MySQL / SQL Server / Oracle / MS Access:
(
O_Id int NOT NULL,
OrderNo int NOT NULL,
P_Id int,
PRIMARY KEY (O_Id),
CONSTRAINT fk_PerOrders FOREIGN KEY (P_Id)
REFERENCES Persons(P_Id)
) *****************************************************************************************************************************************************************************************
ALTER TABLE 時的 SQL FOREIGN KEY 約束
當 "Orders" 表已被建立時,如需在 "P_Id" 列建立 FOREIGN KEY 約束,請使用下面的 SQL:
MySQL / SQL Server / Oracle / MS Access:
ALTER TABLE OrdersADD FOREIGN KEY (P_Id)
REFERENCES Persons(P_Id)
如需命名 FOREIGN KEY 約束,並定義多個列的 FOREIGN KEY 約束,請使用下面的 SQL 語法:
MySQL / SQL Server / Oracle / MS Access:
ALTER TABLE OrdersADD CONSTRAINT fk_PerOrders
FOREIGN KEY (P_Id)
REFERENCES Persons(P_Id)
撤銷 FOREIGN KEY 約束
如需撤銷 FOREIGN KEY 約束,請使用下面的 SQL:
MySQL:
ALTER TABLE OrdersDROP FOREIGN KEY fk_PerOrders
SQL Server / Oracle / MS Access:
ALTER TABLE OrdersDROP CONSTRAINT fk_PerOrders *****************************************************************************************************************************************************************************************
CHECK 約束用於限制列中的值的範圍。
如果對單個列定義 CHECK 約束,那麼該列只允許特定的值。
如果對一個表定義 CHECK 約束,那麼此約束會基於行中其他列的值在特定的列中對值進行限制。
*****************************************************************************************************************************************************************************************
DEFAULT 約束用於向列中插入預設值。
如果沒有規定其他的值,那麼會將預設值新增到所有的新記錄。
通過使用類似 GETDATE() 這樣的函式,DEFAULT 約束也可以用於插入系統值:
CREATE TABLE Orders
(
O_Id int NOT NULL, OrderNo int NOT NULL, P_Id int, OrderDate date DEFAULT GETDATE() )
ALTER TABLE 時的 SQL DEFAULT 約束
當表已被建立時,如需在 "City" 列建立 DEFAULT 約束,請使用下面的 SQL:
MySQL:
ALTER TABLE Persons
ALTER City SET DEFAULT 'SANDNES'
SQL Server / MS Access:
ALTER TABLE Persons
ADD CONSTRAINT ab_c DEFAULT 'SANDNES' for City
Oracle:
ALTER TABLE Persons
MODIFY City DEFAULT 'SANDNES'
撤銷 DEFAULT 約束
如需撤銷 DEFAULT 約束,請使用下面的 SQL:
MySQL:
ALTER TABLE Persons
ALTER City DROP DEFAULT
SQL Server / Oracle / MS Access:
ALTER TABLE Persons
ALTER COLUMN City DROP DEFAULT
****************************************************************************************************************************
CREATE INDEX 語句用於在表中建立索引。
在不讀取整個表的情況下,索引使資料庫應用程式可以更快地查詢資料。
SQL CREATE INDEX 語法
在表上建立一個簡單的索引。允許使用重複的值:
CREATE INDEX index_nameON table_name (column_name)
SQL CREATE UNIQUE INDEX 語法
在表上建立一個唯一的索引。不允許使用重複的值:唯一的索引意味著兩個行不能擁有相同的索引值。Creates a unique index on a table. Duplicate values are not allowed:
CREATE UNIQUE INDEX index_nameON table_name (column_name)
註釋:用於建立索引的語法在不同的資料庫中不一樣。因此,檢查您的資料庫中建立索引的語法。
***************************************************************************************************************************************************
DROP INDEX 語句
DROP INDEX 語句用於刪除表中的索引。
用於 MS Access 的 DROP INDEX 語法:
DROP INDEX index_name ON table_name用於 MS SQL Server 的 DROP INDEX 語法:
DROP INDEX table_name.index_name用於 DB2/Oracle 的 DROP INDEX 語法:
DROP INDEX index_name用於 MySQL 的 DROP INDEX 語法:
ALTER TABLE table_name DROP INDEX index_name
DROP TABLE 語句
DROP TABLE 語句用於刪除表。
DROP TABLE table_name
DROP DATABASE 語句
DROP DATABASE 語句用於刪除資料庫。
DROP DATABASE database_name
TRUNCATE TABLE 語句
如果我們僅僅需要刪除表內的資料,但並不刪除表本身,那麼我們該如何做呢?
請使用 TRUNCATE TABLE 語句:
TRUNCATE TABLE table_name
****************************************************************************************************************************************************
SQL ALTER TABLE 語法
如需在表中新增列,請使用下面的語法:
ALTER TABLE table_nameADD column_name datatype
如需刪除表中的列,請使用下面的語法(請注意,某些資料庫系統不允許這種在資料庫表中刪除列的方式):
ALTER TABLE table_nameDROP COLUMN column_name
要改變表中列的資料型別,請使用下面的語法:
SQL Server / MS Access:
ALTER TABLE table_nameALTER COLUMN column_name datatype
My SQL / Oracle:
ALTER TABLE table_nameMODIFY COLUMN column_name datatype
Oracle 10G 之後版本:
ALTER TABLE table_name
MODIFY column_name datatype;