版權聲明:本文爲博主原創文章,未經博主允許不得轉載。
數據庫完整性
爲了維護數據庫完整性DBMS需要提供:
1. 提供定義完整性約束條件的機制
2. 提供完整性檢查方法:一般在INSERT UPDATE DELETE語句執行後開始檢查或者在事物提交之前進行檢查
3. 違約處理機制:比如拒絕,級聯或者其他操作
實體完整性
用PRIMARY KEY進行定義,對於單屬性,實體完整性可以定義爲列級約束也可以定義爲表級約束;對於多個屬性構成的碼,只能定義爲表級約束。
例如:
定義爲列級約束(列級主碼)
<code class="hljs sql has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"> <span class="hljs-operator" style="box-sizing: border-box;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">CREATE</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">TABLE</span> S( Sno <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">CHAR</span>(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">9</span>) <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">PRIMARY</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">KEY</span>, Sname <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">CHAR</span>(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">20</span>) <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">NOT</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">NULL</span>, ..... );</span> </code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li></ul>
定義爲表級約束(表級主碼)
<code class="hljs sql has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"> <span class="hljs-operator" style="box-sizing: border-box;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">CREATE</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">TABLE</span> S( Sno <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">CHAR</span>(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">9</span>) , Sname <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">CHAR</span>(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">20</span>) <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">NOT</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">NULL</span>, ..... <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">PRIMARY</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">KEY</span>(Sno) );</span> </code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li></ul>
檢查和違約處理:
1. 檢查主碼值是否唯一,如果不唯一就拒絕插入或者修改(全表掃描或者在DBMS爲主碼建立的索引上進行查找,例如B+樹索引)
2. 檢查主碼值對應的各個屬性是否爲空,如果存在爲空的屬性,那麼拒絕插入或者修改
參照完整性
在創建表的時候使用FOREIGN KEY 定義外碼,用REFERENCES短語指定這些外碼參照哪些表的主碼。和主碼類似,外碼也同樣可以定義表級和列級參照完整性。不過感覺沒什麼區別
例如:
<code class="hljs sql has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"> <span class="hljs-operator" style="box-sizing: border-box;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">CREATE</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">TABLE</span> SC( Sno <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">CHAR</span>(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">9</span>) <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">NOT</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">NULL</span>, Cno <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">CHAR</span>(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">4</span>) <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">NOT</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">NULL</span>, ..... <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">PRIMARY</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">KEY</span>(Sno, Cno), <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">FOREIGN</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">KEY</span> (Sno) <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">REFERENCES</span> Sudent(Sno), <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">FOREIGN</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">KEY</span> (Cno) <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">REFERENCES</span> Course(Cno), );</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li></ul>
破壞參照完整性的情形以及違約處理:
1. SC表中插入一個元組但是該元組的Sno屬性在被參照表Student中是不存在的
2. SC表中更新一個元組但是該元組的Sno屬性在被參照表Student中是不存在的
3. Student表中刪除一個元組,導致參照表SC中某些元組的Sno在Student表中不存在
4. Student表中更新一個元組,導致參照表SC中某些元組的Sno在Student表中不存在
發生不一致的時候一般採取的措施是:
1. 拒絕執行
2. 級聯操作:刪除或者修改被參照表導致不滿足參照完整性的時候,級聯刪除慘遭表中所有的不一致元組
3. 設置空值(這也引起一個問題就是在定義外碼的時候是否允許外碼列爲空,如果不允許爲空,那麼就不能按3來處理)
至於採用哪種處理策略,可以在建表的時候顯式指定
<code class="hljs sql has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"> <span class="hljs-operator" style="box-sizing: border-box;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">CREATE</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">TABLE</span> SC( Sno <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">CHAR</span>(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">9</span>) <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">NOT</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">NULL</span>, Cno <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">CHAR</span>(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">4</span>) <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">NOT</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">NULL</span>, ..... <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">PRIMARY</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">KEY</span>(Sno, Cno), <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">FOREIGN</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">KEY</span> (Sno) <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">REFERENCES</span> Sudent(Sno) <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">ON</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">DELETE</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">CASCADE</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">ON</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">UPDATE</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">CASCADE</span>, <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">FOREIGN</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">KEY</span> (Cno) <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">REFERENCES</span> Course(Cno) <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">ON</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">DELETE</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">NO</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">ACTION</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">ON</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">UPDATE</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">CASCADE</span>, );</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li></ul>
用戶自定義完整性
根據具體應用而定義的數據必須滿足的語義要求。分類:
- 列值非空(NOT NULL 短語)
- 列值唯一(UNIQUE 短語)
- 檢查列值是否滿足布爾表達式(CHECK 短語)
<code class="hljs sql has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"> <span class="hljs-operator" style="box-sizing: border-box;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">CREATE</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">TABLE</span> SC( Sno <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">CHAR</span>(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">9</span>) <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">UNIQUE</span>, Cno <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">CHAR</span>(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">4</span>) <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">NOT</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">NULL</span>, Grade <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">SMALLINT</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">CHECK</span>(Grade >=<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">AND</span> Grade <=<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">100</span>), ..... <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">PRIMARY</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">KEY</span>(Sno, Cno), <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">FOREIGN</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">KEY</span> (Sno) <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">REFERENCES</span> Sudent(Sno), <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">FOREIGN</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">KEY</span> (Cno) <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">REFERENCES</span> Course(Cno), );</span> </code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li></ul>
和前面一樣,用戶自定義完整性同樣是可以定義爲列級限制也可以定義爲表級限制。入上述例子就是列級用戶自定義完整性,表級用戶自定義完整新如下:
<code class="hljs sql has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"> <span class="hljs-operator" style="box-sizing: border-box;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">CREATE</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">TABLE</span> Student( Sno <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">CHAR</span>(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">9</span>) <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">UNIQUE</span>, Sname <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">CHAR</span>(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">8</span>) <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">NOT</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">NULL</span>, Ssex <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">CHAR</span>(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>), ..... <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">PRIMARY</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">KEY</span>(Sno), <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">CHECK</span> (Ssex = <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'女'</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">OR</span> Sname <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">NOT</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">LIKE</span> <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'Ms.%'</span>) );</span> </code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li></ul>
兩者的區別是表級限制可以定義不同屬性取值之間的限制。如上述的例子中定義了性別屬性以及姓名屬性兩者之間的約束。
約束檢查和違約處理:
一般採用拒絕執行的方式處理。
完整性命名子句
除了直接使用上述的3中完整性約束之外,SQL還提供了CONSTRAINT完整性約束命名子句,用來對完整性約束條件命名,以方便增加和刪除完整性約束。
完整性命名子句的定義:
直接看例子:
<code class="hljs sql has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"> <span class="hljs-operator" style="box-sizing: border-box;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">CREATE</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">TABLE</span> Student( Sno <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">NUMERIC</span>(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">6</span>) <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">CONSTRAINT</span> C1 <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">CHECK</span>(Sno BETWEEN <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">90000</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">AND</span> <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">99999</span>), Sname <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">CHAR</span>(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">8</span>) <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">CONSTRAINT</span> C2 <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">NOT</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">NULL</span>, Sage <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">NUMERIC</span>(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">3</span>) <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">CONSTRAINT</span> C3 <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">CHECK</span>(Sage < <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">30</span>), Ssex <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">CHAR</span>(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>) <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">CONSTRAINT</span> C4 <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">CHECK</span>(Ssex <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">IN</span> (<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'男'</span>, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'女'</span>)), ..... <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">CONSTRAINT</span> StudentKey <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">PRIMARY</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">KEY</span>(Sno) );</span> </code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li></ul>
完整性命名子句的修改:
直接刪除並重新定義即可
<code class="hljs sql has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"> <span class="hljs-operator" style="box-sizing: border-box;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">ALTER</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">TABLE</span> Student <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">DROP</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">CONSTRAINT</span> C1;</span> <span class="hljs-operator" style="box-sizing: border-box;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">ALTER</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">TABLE</span> Student <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">ADD</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">CONSTRAINT</span> C1 <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">CHECK</span>(Sno BETWEEN <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">900000</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">AND</span> <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">9999999</span>);</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li></ul>
觸發器
觸發器是用戶定義在關係表上的一類由事件驅動的特殊過程。定義之後,任何用戶對數據庫的增刪該操作均由DBMS自動激活相應的觸發器。觸發器類似於約束但是比約束更加靈活。可以實現比foreign key check約束更爲複雜的檢查和操作,具有更加精細和強大的數據控制能力。
觸發器實例:
<code class="hljs sql has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"> <span class="hljs-operator" style="box-sizing: border-box;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">CREATE</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">TABLE</span> Sql_log( Eno <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">NUMERIC</span>(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">4</span>) REFERENCE teacher(Eno), Sal <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">NUMERIC</span>(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">7</span>, <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>), Username <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">CHAR</span>(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">10</span>), <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">Date</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">TIMESTAMP</span> );</span> <span class="hljs-operator" style="box-sizing: border-box;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">CREATE</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">TRIGGER</span> Insert_Sal <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">AFTER</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">INSERT</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">ON</span> Teacher <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">FOR</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">EACH</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">ROW</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">AS</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">BEGIN</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">INSERT</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">INTO</span> Sal_log <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">VALUES</span>(new.Eno, new.Sal, <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">CURRENT_USER</span>, <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">CURRENT_TIMESTAMP</span>);</span> <span class="hljs-operator" style="box-sizing: border-box;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">END</span>;</span> <span class="hljs-operator" style="box-sizing: border-box;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">CREATE</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">TRIGGER</span> Update_Sal <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">AFTER</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">UPDATE</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">ON</span> Teacher <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">FOR</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">EACH</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">ROW</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">AS</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">BEGIN</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">IF</span>(new.Sal <> old.Sal) <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">THEN</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">INSERT</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">INTO</span> Sal_log <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">VALUES</span>(new.Eno, new.Sal, <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">CURRENT_USER</span>, <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">CURRENT_TIMESTAMP</span>);</span> <span class="hljs-operator" style="box-sizing: border-box;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">END</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">IF</span>;</span> <span class="hljs-operator" style="box-sizing: border-box;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">END</span>;</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li></ul>
注意:
1. 表的擁有者纔可以創建該表的觸發器
2. 觸發事件可以使INSERT / DELETE /UPDATE也可以是三者的組合
3. 行級觸發器
同一個表上的觸發器激活順序:
1. 執行before觸發器-同一個表上的多個before觸發器按定義順序執行
2. 激活觸發器的sql語句
3. 觸發器被激活之後,只有當觸發條件爲真的時候才執行觸發動作體。如果省略when觸發條件,那麼觸發動作體在觸發器被激活之後立刻執行
4. 觸發動作體既可以是一個匿名SQL語句也可以是對已經創建的存儲過程的調用。
觸發器的刪除:
被刪除的觸發器必須是一個已經創建的觸發器,而且刪除者也必須有相應的用戶權限。
<code class="hljs sql has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"> <span class="hljs-operator" style="box-sizing: border-box;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">DROP</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">TRIGGER</span> Insert_Sql <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">ON</span> Teacher;</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li></ul>
觸發器分爲事前觸發和事後觸發,兩者的區別?行級觸發(FOR EACH ROW)和語句級觸發( FOR EACH STATEMENT)的區別是什麼?
事前觸發發生在事件發生之前,用驗證一些條件或者準備工作;事後觸發發生在事件發生之後,做收尾工作。事前觸發可以獲取之前的值old和新值new,事後觸發可以保證事務的完整性。
語句級觸發可以在語句執行之前或者執行之後進行,一般只執行一次,而行級觸發,觸事件根據被影響的行的數量,一般會執行多次。同時,行級觸發器可以使用new 和old來引用update/insert事件執行前後的值,但是語句級觸發是不行的。
範式
範式就是符合一定的級別的關係模式的集合,一般有1NF 2NF 3NF BCNF 4NF
1NF
1NF是指滿足數據庫中的每一列都是不可再分的基本數據項,是數據庫最基本的要求(同一列中不能有多個值或者出現重複屬性)。
2NF
2NF是在1NF的基礎上,消除了每一個非主屬性的部分函數依賴。通俗的講就是要求數據庫中的每一行或者每一個實例是可以唯一的被區分開(不存在多種區分方式,也就沒有了部分函數依賴)。
3NF
3NF 是在2NF的基礎上消除了非主屬性的傳遞函數依賴。
BCNF
BCNF在3NF的基礎上又消除了主屬性對碼的傳遞依賴和部分依賴,也就是說BCNF消除了任何屬性(包括主屬性和非主屬性)對碼的部分依賴和傳遞依賴。
一個特殊的BCNF例子就是全碼,顯然全碼不存在非主屬性,因此至少是3NF,而且全碼也不存在傳遞和部分依賴,所以也是BCNF
BCNF是函數依賴範圍內的最佳優化,基本消除了插入和刪除異常,但是對多值依賴範圍內是無效的。
4NF
4NF限制關係模式的屬性之間不存在非平凡且非函數依賴的多值依賴(唯一允許的非平凡多值依賴是函數依賴)。
涉及到的概念:多值依賴,平凡多值依賴,函數依賴等等,直接找本書看看就可以了,確實抽象了一點點。
在多值依賴範圍內,4NF已經是優化程度最高的。
規範化過程:
1NF消除非主屬性的部分函數依賴->2NF消除非主屬性的函數依賴->3NF消除主屬性的部分函數依賴和傳遞函數依賴->BCNF消除非平凡且非函數依賴的多值依賴->4NF
視圖
視圖是從一個或者多個基本表中導出的表,數據庫中值存放視圖的定義而不存放對應視圖的數據。視圖被定義之後就可以和基本表一樣被查詢和刪除,同時在視圖之上還可以繼續定義視圖。對視圖的更新操作(增刪改)是有一定的限制
視圖的定義:
<code class="hljs sql has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"> <span class="hljs-operator" style="box-sizing: border-box;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">CREATE</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">VIEW</span> IS_Student <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">AS</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">SELECT</span> Sno, Sname, Sage <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">FROM</span> Student <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">WHERE</span> Sdept=<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'IS'</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">WITH</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">CHECK</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">OPTION</span>;</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li></ul>
WITH CHECK OPTION表示對數據進行更新update insert delete操作的時候需要保證更新操作滿足定義視圖中的謂詞條件。也就是AS之後的子查詢。
此外,組成視圖的屬性列名要麼全部省略要麼全部指定,必須指定列名的情形:1)目標列是聚集函數或者是列表達式 2)多表連接時選擇了同名列作爲視圖的字段 3)需要在視圖中定義更合適的名字。
如上述的實例,所創建的視圖僅僅是從一個基本表中導出,去掉了基本表的某些行某些列但是保留了主碼,此類視圖稱爲是行列子集視圖。
<code class="hljs sql has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"> <span class="hljs-operator" style="box-sizing: border-box;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">CREATE</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">VIEW</span> BT_S(Sno, Sname, Sbirth) <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">AS</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">SELECT</span> Sno, Sname, <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2016</span>-Sage <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">FROM</span> Student</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li></ul>
在視圖中的數據是不存儲的,有些時候,視圖中的列是經過基本表派生出來的,這些派生列由於在數據庫中並不存儲,因此被稱爲是虛擬列。帶虛擬列的視圖也被稱爲是帶表達式的視圖;
<code class="hljs sql has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"> <span class="hljs-operator" style="box-sizing: border-box;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">CREATE</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">VIEW</span> S_G(Sno, Gavg) <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">AS</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">SELECT</span> Sno, <span class="hljs-aggregate" style="box-sizing: border-box;">AVG</span>(Grade) <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">FROM</span> SC <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">GROUP</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">BY</span> Sno;</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li></ul>
使用聚集函數和GROUP BY子句的查詢來定義的視圖被稱爲是分組視圖。
行列子集視圖是可以更新的,但是分組視圖和帶表達式的視圖一般是不可更新的。
視圖的刪除,一般刪除和級聯刪除。級聯刪除的時候,基於本視圖而定義的視圖也被刪除。
視圖消解:在進行基於視圖的查詢的時候,首先會進行有效性檢查,通過之後,把定義的子查詢和用於的查詢結合起來,轉化爲等價的基本表的查詢,最後執行修正了的查詢。該轉換過程就稱爲是視圖消解。
視圖消解並不一定總是成功的,尤其是非行列子集視圖,因此這類視圖的查詢儘量直接基於基本表進行。
對視圖的更新也是基於視圖消解進行的,而且視圖的更新要求更加嚴格,除了行列子集視圖是可以直接更新之外,其他視圖有些視圖理論上就被證明是無法更新的。
視圖的作用:
1. 簡化用戶操作
2. 使用戶能夠以多種角度看待同一數據
3. 視圖對於重構數據庫提供了一定程度的邏輯獨立性
4. 視圖可以對機密數據提供安全保護
5. 適當的視圖可以實現更加清晰簡潔的查詢
事務
事務是指用戶定義的一個數據庫操作序列,這些操作序列是一個不可分割的工作單位,要麼全做要麼全不做。事務的開始和結束可以由用戶進行顯示的定義和控制,如果沒有定義事務,那麼由DBMS按缺省規定自動劃分事務。
事務的特性:
1. 原子性
2. 一致性:事務的執行時使數據庫從一個一致性狀態到達另外一個一致性狀態
3. 隔離性:一個事務內部的操作及使用的數據對於其他併發執行的事務而言是隔離的,也就是併發執行的各個事務之間是互不干擾的。
4. 持續性:一個事務一旦提交,對於數九的更改就是永久的。接下來的事務或者故障不應對其產生影響
事務是恢復和併發控制的基本單位
可能破壞ACID特性的場景:
1. 多個事務併發執行,不同的事務出現交叉
2. 事務在運行過程中被強行停止
其他
內連接和外連接的區別
一個查詢中涉及多個表,該查詢稱爲是連接查詢。包括等值連接查詢,自然連接查詢,非等值連接查詢,自身連接查詢,外連接查詢和符合條件連接查詢。
當連接運算符爲’=’的時候,稱爲是等值連接,其他都是非等值連接。在等值連接中,將目標列中的重複的去掉,稱爲是自然連接。
查詢中的連接如果是一個表與自身進行連接,稱爲是自身連接。
通常的查詢中,只有滿足連接條件的元組纔會輸出,如果在插敘中將主體表中不滿足條件的元組一併輸出,並且在不滿足條件的列上填NULL,這種類型的連接稱爲是外連接。根據主體表的選擇的不同,尅分爲左外連接(主體表爲左邊關係,輸出左邊關係中不滿足連接條件的列)和右外連接(主體表爲右邊關係,輸出右邊關係中不滿足連接條件的列)。
如果where子句中,有多個條件(連接條件或者其他限定條件),稱爲複合條件連接。
例如:
<code class="hljs avrasm has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"> SELECT Student<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.Sno</span>, Sname FROM Student, SC WHERE Student<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.Sno</span>=SC<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.Sno</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">AND</span> SC<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.Cno</span>=<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'2'</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">AND</span> SC<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.Grade</span>><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">90</span><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li></ul>
連接可以使兩個表之間,也可以是多個表之間,多表之間的連接稱爲是多表連接。
存儲過程與函數的區別
SQL的執行需要先進行編譯然後纔可以執行。大型DBMS爲了提高效率,將完成特定功能的SQL語句進行編譯優化,存儲在數據庫服務器中,用戶可以通過指定存儲過程的名字來調用執行。
創建:
create procedure pro_name @ [參數名] [類型]
as
begin
….
end
調用: exec pro_name [參數名]
刪除: drop procedure pro_name
存儲過程可以增強SQL語言的功能和靈活性,因爲可以使用流程控制語句編寫,所以具有很強的靈活性,可以用於實現複雜的判斷和運算。存儲過程不是函數,兩者的區別:
1. 存儲過程可以作爲獨立的部分執行,而函數可以作爲查詢語句的一部分被調用
2. 存儲過程一般實現的功能比較複雜,而函數實現的比較有針對性
3. 函數可以嵌套在SQL中,也可以在select中使用,而存儲過程不可以
4. 函數不可以操作實體表,只能操作內建表
5. 存儲過程創建的時候就在服務器上進行了編譯,所以速度比較快
- 頂
- 2