1. 程式人生 > 實用技巧 >003 約束和關係

003 約束和關係

/*
時間:2020/09/06
功能:
    一 約束
        1 概念
        2 操作
        
    二 關係
        1 概念
        2 操作
*/    
    
    


一 約束
  1 概念

/*
約束
    1 定義: 對一個表中屬性進行限制。
    2 具體
        (1) 主鍵約束: 不允許重複元素,避免資料
        (2) 外來鍵約束: 保證本表資料與其他表資料存在關聯。
        (3) check約束: 保證事物check列屬性取值在合理範圍
        (4) default約束: 保證事物default列屬性有預設值,一定有一個值。
        (5) unique約束: 保證事物屬性不允許重複
                (a) SqlServer 只允許unique列一個為null
                (b) Oracle 允許unique列多個為null
        (6) not null: 該列不能為空。
        
    3 對比:
        (1) null和default
                (a) 相同: 允許使用者不賦值
                (b) 不同: null預設是null, default預設是指定值。
        
表和約束:
    1 資料庫通過表解決事物的資料,儲存和複雜操作問題(增刪改查)
    2 資料庫通過表解決事物的屬性,有效性和合理性問題
        (1) 表內: 表內列屬性通過約束,來表示事物區域性資料有效性和合理性。
        (2) 表外: 表與表之間通過約束,來表示事物整體資料關聯性和完整性。
*/

  2 操作

create table Student
(
    stu_id int primary key,
    stu_sal int check (stu_sal >= 1000 and stu_sal <= 8000),
    stu_sex nchar(1) default(''),
    stu_name nvarchar(200) unique
)

INSERT INTO Student values(4, 6000, '', null)
INSERT INTO Student values(5, 6000, '', 1)

INSERT INTO Student values
(null, 8000, '', 9) -- 不能將值 NULL 插入列 'stu_id' INSERT INTO Student values(4, 6000, '', 100) -- 違反了 PRIMARY KEY 約束 INSERT INTO Student values(6, 12000, '', 2) -- 與 CHECK 約束"CK__Student__stu_sal__0EA330E9"衝突 INSERT INTO Student values(7, 6000, '', 1) -- 違反了 UNIQUE KEY 約束 INSERT INTO Student values(8, 8000
, '', 2) -- 執行成功 insert into student(stu_id, stu_sal, stu_name) values (1, 1000, '榨汁機'); SELECT * FROM Student

二 關係
  1 概念

/*
關係:
    1 定義: 表和表之間的聯絡
    2 實現: 設定外來鍵
    3 分類: 
        (1) 一對一: 既可以把表A主鍵充當表B的外來鍵,也可以把表B的主鍵充當表A的外來鍵。
        (2) 一對多: 把表A主鍵充當表B的外來鍵。
        (3) 多對多: 通過單獨的一張表來表示。
*/

  2 操作

-- 班級表
use TestData
create table banji
(
    banji_id int primary key,
    banji_num int not null,
    banji_name nvarchar(100)
)

-- 教師
create table jiaoshi
(
    jiaoshi_id int primary key,
    jiaoshi_name nvarchar(200)
)

-- 第三張表 : 模擬班級和教師關係
create table banji_jiaoshi_mapping
(
    banji_id int constraint fk_banji_id foreign key references banji(banji_id),
    jiaoshi_id int foreign key references jiaoshi(jiaoshi_id),
    kecheng nvarchar(20),
    constraint pk_banji_id_jiaoshi_id primary key(banji_id, jiaoshi_id, kecheng)
)

select *
    from banji

select *
    from jiaoshi

select *
    from banji_jiaoshi_mapping