sql基礎語法-創建表和約束


創建數據庫表

USE SQL2016
IF OBJECT_ID('dbo.Employees','U') IS NOT NULL
DROP TABLE dbo.Employees;

Create TABLE dbo.Employees
(
empid INT NOT NULL,
firstname VARCHAR(30) NOT NULL,
lastname VARCHAR(30) NOT NULL,
salary Money Null
);

USE SQL2016
IF OBJECT_ID('dbo.Orders','U') IS NOT NULL
DROP TABLE dbo.Orders;

Create TABLE dbo.Orders
(
orderid INT NOT NULL,
empid INT NOT NULL,
customerid VARCHAR(30) NOT NULL,
qty INT NOT Null,
orderdatetime DATETIME2 NOT NULL,
CONSTRAINT PK_Orders--建立表時,直接創建主鍵約束
PRIMARY KEY (orderid)
);
--表已經存在,創建主鍵約束
ALTER TABLE dbo.Employees
ADD CONSTRAINT PK_Employees
PRIMARY KEY(empid);

--唯一約束
ALTER TABLE dbo.Employees 
ADD CONSTRAINT UNQ_Employees_lastname
UNIQUE(lastname);


--外鍵約束
ALTER TABLE dbo.Orders
ADD CONSTRAINT FK_Orders_Employees
FOREIGN KEY(empid)
REFERENCES dbo.Employees(empid);

--CHECK約束
ALTER TABLE dbo.Employees
Add CONSTRAINT CHK_Employees_Salary
CHECK(salary>0.00);

--默認約束
ALTER TABLE dbo.Orders
ADD CONSTRAINT DFT_Orders_orders
DEFAULT(SYSDATETIME()) FOR orderdatetime

 創建測試數據

--創建測試數據

--以下兩段腳本創建了 兩個employee 

USE [SQL2016]
GO

INSERT INTO [dbo].[Employees]
([empid]
,[firstname]
,[lastname]
,[salary])
VALUES
(1,'zhang','san',5000)
GO

INSERT INTO [dbo].[Employees]
([empid]
,[firstname]
,[lastname]
,[salary])
VALUES
(2,'li','si',6000)
GO 

--以下腳本創建了兩個orders

USE [SQL2016]
GO

INSERT INTO [dbo].[Orders]
([orderid]
,[empid]
,[customerid]
,[qty])
VALUES
(1,1,'CUS1',10)
GO

INSERT INTO [dbo].[Orders]
([orderid]
,[empid]
,[customerid]
,[qty])
VALUES
(2,2,'CUS2',20)
GO

 

驗證約束條件

驗證外鍵約束,empid為3的employee不存在,故以下腳本報錯

USE [SQL2016]
GO

INSERT INTO [dbo].[Orders]
([orderid]
,[empid]
,[customerid]
,[qty])
VALUES
(3,10,'CUS1',10)
GO

 

驗證外鍵約束,刪除主表記錄,主表中的值被其他表引用,empid=1的記錄在order中被引用,故刪除錯誤

USE [SQL2016]
DELETE FROM dbo.Employees WHERE empid=1
GO

 

驗證外鍵約束,UPDATE主表記錄,主表中的值被其他表引用,empid=1的記錄在order表中被引用,故更新失敗

USE [SQL2016]
UPDATE dbo.Employees set empid=4 where empid=1
GO

 

外鍵約束默認執行 no action引用操作,即delete 和 update 數據時,如果被引用,則默認不允許操作。

 

其他選項:
CASCADE:將級聯相關的行
SET DEFAULT:將相關行設置為默認值
SET NULL:將相關行設置為NULL

將Delete Rule 和Update Rule 改為 CASCADE后。

執行以下腳本,將empid=1改為4,刪除empid=2的記錄。則應該自動修改Orders里的empid=1的改為4,刪除empid=2的orders

USE [SQL2016]
GO
UPDATE dbo.Employees set empid=4 where empid=1

DELETE FROM dbo.Employees WHERE empid=2

GO

SELECT * FROM dbo.Orders

 

 

CHECK 約束僅當false時拒絕操作,當為true和unknow時允許操作,例如
-1000,拒絕操作
5000,允許操作
NULL,允許操作
WITH NOCHECK 選項:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM