資料庫約束是為了保證資料的完整性而實現的一套機制,它具體的根據各個不同的資料庫的實現而有不同的工具.
一般來說有以下幾種實現方式:
1、檢查約束:
通過在定義資料庫表裡,在字段級或者是在表級加入的檢查約束,使其滿足特定的要求.
比如以下的表定義:
crate table student(
id serial,
name varchar(10),
scrore integer check (scrore > 0));
定義分數不能小於0.
也可以在表級定義:
check (欄位1的條件(比如 欄位1>100)
2、非空約束:
3、唯一約束:
定義乙個唯一約束但是它並不包括null值.直接在字段定義後加入unique即可定義乙個唯一約束.
4、主鍵約束:
sql 92建議在建立乙個表時定義乙個主鍵:它其實就是:唯一約束+非空約束.
5、外來鍵:
所有約束里數這個約束最有意思了:比如說有這樣一件事,你需要做乙個學生查詢的網頁.那麼為了方便,你將建立三個資料表:
乙個是學生情況表:
create table student(
id serialprimary key,
name varchar(10),
乙個表是記錄所開的課程
create table class(
class_id varchar(5) primary key,
describe varchar(20)
乙個表是記錄學生成績的表:
create table score(
id integer references student,
class_id varchar(5) references class,
score integer check (score > 0)
這個時候你會發現以下幾件事:
如果你在成績表裡輸入不存在的學生和課程,資料系統將拒絕.如果你要刪除乙個學生,但是他已經在成績表裡有記錄,資料庫將拒絕刪除這個學生的記錄.
那麼我們現在來看,前面乙個對我們是有利的,因為誰都不想乙個學生無緣無故的有了乙個成績的記錄,但是在刪除的時候就會比較麻煩了,有時候我的確是想刪除這個學生.那麼我總不能在應用程式裡照顧得那麼周到吧.不要緊我們在定義資料表的時候只在外鍵那一樣加入以下控制就ok了,我們來重新定義資料表 score
create table score(
id integer references student on update cascade on delete cascade,//我們希望在學生記錄改變時自動改變分數記錄,在刪除學生級聯刪除分數記錄
class_id varchar(5) references class on update cascade on delete
restrict,//我們希望在改變課程時自動改變分數記錄表裡關於課程的引用,但是不希望刪除課程時級聯刪除分數.
這樣我們就可以很好做到資料完整了.
外來鍵:如果顯示這種錯誤是什麼原因?
分析:1、看看主鍵 和 外來鍵 的 資料型別 是不是設定的不一樣
3、ref的值需要在所參考的表的那乙個主鍵中已經存在了,因此刪除不符合的資料或者刪除全部資料或者到被參考的表中新增相應有效的資料即可。
(1)只有innodb型別的表才可以使用外來鍵,mysql預設是myisam,這種型別不支援外來鍵約束
(2)外來鍵的好處:可以使得兩張表關聯,保證資料的一致性和實現一些級聯操作;
(3)外來鍵的作用:
保持資料一致性,完整性,主要目的是控制儲存在外鍵表中的資料。 使兩張表形成關聯,外來鍵只能引用外表中的列的值!
(4)建立外來鍵的前提:
兩個表必須是innodb表型別。
----如果我們想用外來鍵那麼我們該怎麼修改 ---mysql如何修改表型別(表引擎)?
修改 mysql 表型別的 sql 語句:
alter table 表名 type = myisam;
alter table 表名 type = innodb;
如果以上修改報錯的話就用以下這句:
alter table 表名 engine= innodb;
附 mysql 表型別說明
myisam:這個是預設型別,它是基於傳統的isam型別,isam是indexed sequential access method (有索引的 順序訪問方法) 的縮寫,它是儲存記錄和檔案的標準方法。與其他儲存引擎比較,myisam具有檢查和修復**的大多數工具。 myisam**可以被壓縮,而且它們支援全文搜尋。它們不是事務安全的,而且也不支援外來鍵。如果事物回滾將造成不完全回滾,不具有原子性。如果執行大量 的select,myisam是更好的選擇。
innodb:這種型別是事務安全的。它與bdb型別具有相同的特性,它們還支援外來鍵。innodb**速度很快,具有比bdb還豐富的特性,因此如果需要乙個事務安全的儲存引擎,建議使用它。如果你的資料執行大量的insert或update,出於效能方面的考慮,應該使用innodb表。
對於支援事物的innodb型別的標,影響速度的主要原因是autocommi,預設設定是開啟的,而且程式沒有顯式呼叫begin 開始事務,導致每插入一條都自動commit,嚴重影響了速度。可以在執行sql前呼叫begin,多條sql形成乙個事物(即使autocommit打 開也可以),將大大提高效能。
使用在外鍵關係的域必須為索引型(index)。
使用在外鍵關係的域必須與資料型別相似
(5)建立的步驟
指定主鍵關鍵字: foreign key(列名)
引用外來鍵關鍵字: references (外來鍵列名)
(6)事件觸發限制:on delete和on update , 可設引數cascade(跟隨外來鍵改動), restrict(限制外表中的外來鍵改動),set null(設空值),set default(設預設值),[預設]no action
(7)舉例
outtable表 主鍵 id 型別 int
建立含有外來鍵的表:
**如下:
create table temp(
id int,
name char(20),
foreign key(id) references outtable(id) on delete cascade on update cascade);
說明:把id列 設為外來鍵 參照外表outtable的id列 當外來鍵的值刪除 本表中對應的列篩除 當外來鍵的值改變 本表中對應的列值改變。
****如下:
create table temp( id int, name char(20), foreign key(id) references outtable(id) on delete cascade on update cascade);
缺點:在對mysql做優化的時候類似查詢快取,索引快取之類的優化對innodb型別的表是不起作用的,還有在資料庫整體架構中用得同步複製也是對innodb型別的表不生效的,像資料庫中核心的表類似商品表請大家盡量不要是使用外來鍵,如果同步肯定要同步商品庫的,加上了外來鍵也就沒法通不了,優化也對它沒作用,豈不得不償失,做外來鍵的目的在於保證資料完整性,請大家通過程式來實現這個目的而不是外來鍵,切記!
mysql表操作約束 MySQL操作表的約束
完整性 指資料庫的準確性和一致性。約束 是在表中定義的用於維護資料庫完整性的一些規則。主鍵 給某乙個欄位來唯一標識所有記錄,值是唯一的,非空的 外來鍵 多個表之間參照的完整性。一 設定非空約束 use教學管理資料庫 show tables create table專業表 專業編號char 3 not...
mysql怎麼約束 mysql 約束
4 約束 1 對乙個列新增的約束叫列級約束。對兩個或兩個以上的列新增的約束叫做表級約束。2 表級約束只能在字段後面新增,列級約束既可以新增在字段後面,也可以在最後新增。3 非空 預設只存在列級約束。主鍵 唯 一 外來鍵都既有表級約束又有列級約束。4 約束有 primary key 主鍵 unique...
mysql約束 MySQL 約束型別
約束是一種限制,它通過對錶的行或列的資料做出限制,來確保表的資料的完整性 唯一性。mysql中,常用的幾種約束 約束型別 主鍵外來鍵唯一非空自增預設值 關鍵字 primary key foreign key unique not null auto increment default 1 主鍵約束 ...