python學習------9.13----約束、表之間的關聯關係

約束python

 

分類:
            not null 非空約束  數據不能爲空
                     學生表的姓名字段
                    create table student (id ind,name char(10) not null);

            default  默認值約束   能夠指定字段的默認值
            create table user (id ind,name char(10) not null,sex char(1) default "woman");
                     美柚的性別字段 默認爲女
                     遊戲 註冊成功 送一萬金幣

            unique   惟一性約束  該字段的值不能重複
                     身份證 手機號 學號
                     unique實際上是一種索引
                        索引是一種數據結構 用於提升查詢效率

                     能夠爲空
                     一張表中能夠有多個惟一約束

                     單列惟一約束
                     create table t5(idcard char(18) unique);
                     多列聯合惟一約束
                     create table t6(idcard char(18),phonenumber char(11),unique(idcard,phonenumber));
                     意思: 身份證相同 而且 手機號相同 那就叫相同


            primary key  ******
                稱之爲主鍵約束
                用於惟一標識表中一條記錄
                    如何能作到惟一標識 該字段 只要是唯一的 而且不爲空 便可
                    也就是說 從約束的角度來看主鍵約束 和 非空 加 惟一約束 沒有區別
                    那它們之間的區別是什麼?
                    惟一約束 是一種索引 必然存在硬盤上的某個文件中  是物理層面(實實在在存在的數據)
                    primary key 是一種邏輯意義上的數據 (實際上不存在)
                    換句話說 主鍵 就是由 惟一約束 和非空約束 組成的約束
                    就像 一男一女 能夠組成夫妻 可是夫妻只是一種稱呼 不實際存在

            語法:
                create table stu (stuid int primary key,name char(3));
                create table t7(id int unique not null,name char(3));

            有主鍵 和沒有主鍵的區別?
                1.沒法區分兩個相同記錄 好比班級裏有兩我的名字相同
                2.有主鍵則意味有這索引  效率更高
                3.能夠創建關聯關係

             多列聯合主鍵:
                create table t8(idcard char(18),phonenumber char(11),primary key(idcard,phonenumber));

             要不要主鍵?
                必須的 每一個表都應該有主鍵 哪怕不用惟一標識 也應該考慮提高效率
                主鍵的字段名 幾乎都叫id
             同一個表中能夠不能夠有多個主鍵?
                不能夠 沒有任何意義
             主鍵的類型須要設置爲整型,固然別的也行!建議你別這麼幹!


            練習
            建立一個員工表 裏面存儲 員工信息 員工編號 姓名 年齡 性別
            create table employee (id int primary key,name char(10) not null,age int not null,sex char(10) default "man");
            插入數據
            INSERT INTO employee VALUES(1,"楊總",20),(2,"egon",49),(3,"wxx",28);
            問題?  你極可能忘記上一次的id到第幾了 致使你要先查看一下
                   麻煩影響效率  因此有了auto_increment


            auto_increment ******
                  中文  自動增加
                  做用   一般搭配主鍵字段使用  能夠自動爲你的數據分配逐漸
                    如何分配的?
                    添加一條就自動加1  計數從1開始

             語法: ******
                create table t9(id int primary key auto_increment,name char(3));

                若是主鍵是自動增加  你能夠跳過這個字段 也能夠爲它插入null  均可以

                修改自動增加的起始位置  **
                alter table t9 auto_increment = 7;

             注意: 自動增加 只能用於整型



            foreign key ******

 

 

 

 

 

mysql提供了 foreign key 專門用於爲表和表之間 創建物理關聯


思考 表裏存儲的是一條條的記錄
     兩個表之間能產生的關係有哪些?
        現有 A B兩張表
        1.多對一
        2.一對一
        3.多對多

      在查找表之間的關係時  要分別站在 不一樣表去思考
        1. 從員工出發  員工對於部門來講 時 多個員工對應一個部門
        2. 從部門出發  一個部門對應多個員工
            若是兩個獲得的關係不一樣 則認爲 這種多對一關係是單向


      先建立部門表
      create table dept(id int primary key auto_increment,name char(10),manager char(10));
      在建立員工表
      create table emp(id int primary key auto_increment,name char(10),dept_id int,foreign key(dept_id) references dept(id));


        需求: 設計  學員表 和 班級表  五分鐘練習
              兩個表多對一的關係  經過外鍵來進行關聯
              外鍵加在誰身上?   加到從表上
              create table class(id int primary key auto_increment,name char(10));
              create table student(id int primary key auto_increment,name char(10),c_id int,foreign key(c_id) references class(id));

        總結: 外鍵的做用  表與表之間創建聯繫
        添加外鍵約束時: 產生的限制
                       被關聯的表須要先被建立
                       部門數據(主表)應該先插入   員工數據(從表)後插入
                       在刪除部門數據前(主表)前 要保證該部門的員工數據都刪除了
                       在更新部門編號前  要先保證沒有員工關聯到這個部門

        簡單的說 外鍵指的是 另外一張的主鍵

        外鍵加上之後 主表中的數據 刪除 和更新時 都受到限制
            解決的方案是爲 外鍵 添加 級聯操做

      

級聯操做
指的是就是同步更新和刪除
語法:在建立外鍵時 在後面添加 on update cascade 同步更新
on delete cascade 同步刪除mysql

 
 

實例:
create table class(id int primary key auto_increment,name char(10));sql

 
 

create table student(
id int primary key auto_increment,
name char(10),
c_id int,
foreign key(c_id) references class(id)
on update cascade
on delete cascade
);數據結構

 
 

insert into class value(null,"python3期");
insert into student value(null,"羅傲宇",1);ui

 
 

對主表的id進行更新
以及刪除某條主表記錄 來驗證效果spa

 

 

 

 

 

 

 

 

多對多關係的處理:
           創建一個第三方表  專門存儲兩個表之間的關係
           這個關係表 應該有兩個字段  分別關聯學生的id  和老師的id
           爲了保證  數據的合法性 完整性 給這兩個字段都添加外鍵約束
               實例:  見圖2
               create table teacher (id int primary key auto_increment,name char(10));
               create table student (id int primary key auto_increment,name char(10));
               create table t_s (t_id int,
               s_id int,
               foreign key(t_id) references teacher(id),
               foreign key(s_id) references student(id)
               );

               爲了不重複無用的關係數據  關係表加上關聯的主鍵約束
               create table t_s (t_id int,
               s_id int,
               foreign key(t_id) references teacher(id),
               foreign key(s_id) references student(id),
               primary key(t_id,s_id)
               );

               insert into student value(null,"lxx");
               insert into teacher value(null,"exx");
               insert into t_s value(1,1);
相關文章
相關標籤/搜索