這篇隨筆用來記錄資料庫的學習,隨時更新補充,主要寫一些比較少關註的內容 PERSISTED: 說明物理存儲計算列的值(書本上的解釋,什麼鬼意思...) 現實操作中,CHECK、FOREIGN KEY 和 NOT NULL 約束要求計算列是持久化(PERSISTED)的。 大概它的作用就是這個吧? A ...
這篇隨筆用來記錄資料庫的學習,隨時更新補充,主要寫一些比較少關註的內容
PERSISTED:
說明物理存儲計算列的值(書本上的解釋,什麼鬼意思...)
現實操作中,CHECK、FOREIGN KEY 和 NOT NULL 約束要求計算列是持久化(PERSISTED)的。
大概它的作用就是這個吧?
AS CONVERT (AS是計算列關鍵字,CONVERT將字元串從一個字元集轉化為另一個字元集):
CREATE TABLE test.測試
(
字元串 char(10) PRIMARY KEY
新字元串 AS CONVERT(TINYINT,SUBSTRING(字元串,3,2)) PERSISTED NOT NULL --從字元串第三位開始(包括第三位),截取兩個字元
)
CHECK 裡面使用 OR 和 IN
CREATE TABLE test.學生(
學號 char(10) PRIMARY KEY,
姓別 char(2) CHECK(姓別='男' OR 姓別='女'),
狀態 char(4) CHECK(狀態 IN('正常','留級','休學','退學'))
)
聯合關鍵字?
(1)學號和課程編號兩列構成主關鍵字(需要表級完整性約束)
(2)學號參照學生表的學號(約束選課的學生必須存在)
(3)課程編號參照課程表的課程編號(約束被選的課程必須存在)
CREATE TABLE test.選課
(
學號 char(10) FOREIGN KEY REFERENCES student.學生,
課程編號 char(6) FOREIGN KEY REFERENCES student.課程,
考試成績 tinyint CHECK(考試成績 BETWEEN 0 AND 100) DEFAULT NULL
PRIMARY KEY(學號,課程編號)
)
如果某列定義了外部關鍵字約束,則需要先刪除相關的約束,才能刪除此列。
CREATE TABLE test.課程(
責任教師 char(6) CONSTRAINT duty_teacher
FOREIGN KEY REFERENCES student.教師(編號),
)
第一步:ALTER TABLE test.課程 DROP duty_teacher
第二步:ALTER TABLE test.課程 DROP COLUMN 責任教師
ON DELETE SET NULL --當刪除時,該列置為空值
ON UPDATE CASCADE --級聯更新