MySQL學習(二) 建表約束與正規化

2021-10-08 08:39:44 字數 4102 閱讀 3751

使某個欄位不重複且不得為空,確保表內所有資料的唯一性。

create table student (

id int primary key,

name varchar(20)

);

聯合主鍵中的每個欄位都不能為空,並且加起來不能和已設定的聯合主鍵重複。

create table user (

id int,

name varchar(20),

password varchar(20),

primary key(id, name)

);

自增約束的主鍵由系統自動遞增分配。

create table user (

id int primary key auto_increment,

name varchar(20)

);

忘記設定主鍵,還可以通過sql語句設定(兩種方式):

alter table user add primary key(id);

alter table user modify id int primary key;

alter table user drop primary key;
約束某個字段不能為空

create table user (

id int,

name varchar(20) not null

);

alter table user modify name varchar(20);
create table user2 (

id int,

name varchar(20),

age int default 10

);

```mysql

-- 班級

create table classes (

id int primary key,

name varchar(20)

);-- 學生表

create table students (

id int primary key,

name varchar(20),

-- 這裡的 class_id 要和 classes 中的 id 字段相關聯

class_id int,

-- 表示 class_id 的值必須來自於 classes 中的 id 字段值

foreign key(class_id) references classes(id)

);-- 1. 主表(父表)classes 中沒有的資料值,在副表(子表)students 中,是不可以使用的;

-- 2. 主表中的記錄被副表引用時,主表不可以被刪除。

```

設計關聯式資料庫時,遵從不同的規範要求,設計出合理的關係型資料庫,這些不同的規範要求被稱為不同的正規化,各種正規化呈遞次規範,越高的正規化資料庫冗餘越小。

目前關聯式資料庫有六種正規化:第一正規化(1nf)、第二正規化(2nf)、第三正規化(3nf)、巴斯-科德正規化(bcnf)、第四正規化(4nf)和第五正規化(5nf,又稱完美正規化)。滿足最低要求的正規化是第一正規化(1nf)。在第一正規化的基礎上進一步滿足更多規範要求的稱為第二正規化(2nf),其餘正規化以次類推。一般說來,資料庫只需滿足第三正規化(3nf)就行了。

物件object,也稱為實體型。在現實世界中具有相同性質、遵循相同規則的一類事物的抽象稱為物件。物件是實體集資料化的結果,比如學生、老師、課程等是物件。

例項instance 是指物件中的每乙個具體的事物,例如學生張

三、李四。

屬性attribute 是實體的某一方面特徵的抽象表示,例如學生的姓名、性別、班級、年齡等。

主碼primary key 能夠唯一標識乙個實體。

次碼secondary key 指實體中不能唯一標識實體的屬性。

域domain 指屬性的取值範圍,比如性別中的男、女。

完整性 指儲存在資料庫中的所有資料值均正確的狀態。如果資料庫中儲存有不正確的資料值,則該資料庫稱為已喪失資料完整性。

當關係模式r的所有屬性都不能在分解為更基本的資料單位時,稱r是滿足第一正規化的,簡記為1nf。滿足第一正規化是關係模式規範化的最低要求,否則,將有很多基本操作在這樣的關係模式中實現不了。

如果學生成績表中的一列屬性是成績,而成績這一列還包含了語文、數學、英語等等小屬性,這這張表不滿足第一正規化

如果關係模式r滿足第一正規化,並且r得所有非主屬性都完全依賴於r的每乙個候選關鍵屬性,稱r滿足第二正規化,簡記為2nf。

關係模式必須滿足第一正規化,並且所有非主屬性都完全依賴於主碼。注意,符合第二正規化的關係模型可能還存在資料冗餘、更新異常等問題。

```mysql

-- 訂單表

create table myorder (

product_id int,

customer_id int,

product_name varchar(20),

customer_name varchar(20),

primary key (product_id, customer_id)

);```

`product_name` 只依賴於 `product_id` ,`customer_name` 只依賴於 `customer_id` 。也就是說,`product_name` 和 `customer_id` 是沒用關係的,`customer_name` 和 `product_id` 也是沒有關係的。

這就不滿足第二正規化:其他列都必須完全依賴於主鍵列,所以需要對錶進行拆分

```mysql

create table myorder (

order_id int primary key,

product_id int,

customer_id int

);create table product (

id int primary key,

name varchar(20)

);create table customer (

id int primary key,

name varchar(20)

);```

拆分之後,`myorder` 表中的 `product_id` 和 `customer_id` 完全依賴於 `order_id` 主鍵,而 `product` 和 `customer` 表中的其他欄位又完全依賴於主鍵。滿足了第二正規化的設計.

設r是乙個滿足第一正規化條件的關係模式,x是r的任意屬性集,如果x非傳遞依賴於r的任意乙個候選關鍵字,稱r滿足第三正規化,簡記為3nf.

關係模型滿足第二正規化,所有非主屬性對任何候選關鍵字都不存在傳遞依賴。即每個屬性都跟主鍵有直接關係而不是間接關係,像:a-->b-->c。一般資料庫設計中,一般要求達到3nf,第四第五較少涉及。

```mysql

create table myorder (

order_id int primary key,

product_id int,

customer_id int,

customer_phone varchar(15)

);```

表中的 `customer_phone` 有可能依賴於 `order_id` 、 `customer_id` 兩列,也就不滿足了第三正規化的設計:其他列之間不能有傳遞依賴關係。

```mysql

create table myorder (

order_id int primary key,

product_id int,

customer_id int

);create table customer (

id int primary key,

name varchar(20),

phone varchar(15)

);```

修改後就不存在其他列之間的傳遞依賴關係,其他列都只依賴於主鍵列,滿足了第三正規化的設計.

Mysql建表約束

2.自增約束 3.唯一約束 4.非空約束 5.預設約束 6.外來鍵約束 7.檢查約束 無效 8.列舉型別約束 9.觸發器 trigger 約束 1.主鍵約束 它是能夠唯一確定一張表中的一條記錄,也就是我們通過給某個字段新增約束,也就是使得改字段不重複而且不為空 1.1 普通主鍵約束 create t...

MySQL建表約束

它能夠唯一確定一張表中的記錄,也就是我們通過給某個字段新增約束,就可以使得該字段不重複且不為空。create table user id int primary key,name varchar 20 insert into user values 1,張三 唯一 不能再次插入id 1的記錄 資料 ...

mysql建表約束

mysql的約束主要有主鍵約束,外來鍵約束,唯一約束,非空約束,預設約束 主鍵約束 它能夠唯一確定一張表中的一條記錄.也就是我們通過給某個字段新增約束,就使得該字段不重複且不為空 mysql create table texts id int primary key,name varchar 20 ...