32日目デフォルトデフォルト値一意の単一列一意および共用体一意の主キー主キーauto_increment自己インクリメント外部キーテーブルとテーブル間の外部キーの関係


前に言った制約
zerofill(0で埋める)
unsigned(制約条件値unsigned unsigned)
not null non-empty(空を挿入できません)

データ挿入時に補足知識ポイントを指定できます

create table t1(
    id int,
    name char(16)
    );
insert into t1(name id)values("nana",1)

デフォルトデフォルト値
デフォルトコード表示

create table t2(
id int,
name char(16),
gender enum("male","female","other")default"male"
);
insert into t2(id,name)values(1,"nana");   gender显示默认为male
insert into t2 values(2,"dada","female");   gender显示为female
desc t2;
select * from t2;

ユニーク

单列唯一
    create table t3(
    id int unique,
    name char(16)
    );
    insert into t3 values(1,"jason"),(1,"dada");    id两都是1,报错
    insert into t3 values(1,"jason"),(2,"dada");    id是唯一的,正常存储
    desc t3;
    select * from t3;
联合唯一
比如ip和port
单个都可以重复 但是加在一起必须是唯一的
联合唯一代码验证
    create table t4(
        id int,
        ip char(16),
        port int,
        unique(ip,port)
        );
    insert into t4 values(1,"127.0.0.1",8080);
    insert into t4 values(2,"127.0.0.1",8081);
    insert into t4 values(3,"127.0.0.2",8080);
    insert into t4 values(4,"127.0.0.1",8080);  报错
    desc t4;
    select * from t4;

主キー主キー
制約効果の観点から、主キーはnull以外+一意と同等です。
空でなく、一意です。

主键代码验证
    create table t5(id int primary key);
    insert into t5 values(null);    报错
    insert into t5 values(1)(1);   报错
    insert into t5 values(1),(2);   正常
    desc t5;
    select * from t5;

制約効果に加えて、Innodbストレージエンジンがデータを整理するための基礎でもあります
。Innodbストレージエンジンは、
クエリの効率を高めるのに役立つブックカタログに似ているため、テーブルの作成後に主キーを持っている必要があります。また、テーブルを構築するための基礎。

テーブルには主キーが1つだけあります。主キーを設定しない場合、
空でない一意のフィールドが見つかるまで上から下に検索され、自動的に主キーにアップグレードされます。

代码演示
    create table t6(
        id int,
        name char(16),
        age int not null unique,
        addr char(32) not null unique
        );
    
    desc t6;  (age key项自动升级为PRI主键)

テーブルに主キーがなく、他の空でない一意のフィールドがない場合、Innodbはそれ自体が
提供する非表示フィールドを主キーとして使用します。非表示とは、それを使用できず、クエリ速度を提供できないことを意味します。

通常、テーブルには主キーフィールドが必要であり、idフィールドは通常主キーとして使用されます

単一フィールドの主キー

代码演示
    create table t7(
        id int primary key,
        name char(16)
        );
    desc t7;

結合された主キー(テーブルの主キーとして結合された複数のフィールドは基本的に主キーです)

代码演示
    create table t8(
        id int,
        port int,
        primary key(ip,port)
        );
    desc t8;
我们以后在创建表的时候id字段一定要加primary key(数据的唯一标识)

auto_increment(データの数を自動的に増やす)
数が多すぎると、人為的に維持するのが面倒になります

代码演示
    create table t9(
        id int primary key auto_increment,
        name char(16)
        );
    insert into t9(name) values("jason"),("nana"),("dada");
    select * from t9;
    
注意auto_increment通常都是加在primary key主键上,不能给普通字段加
代码演示
    create table t10(id int auto_increment);    报错
    
总结:
    以后在创建表的id(数据的唯一标识id,uid,sid)字段的时候
    id int primary key auto_increment

补充:
    delete from在删除表中数据的时候,主键的自增不会停止
    truncate t1清空表数据并重置主键
代码演示
    delete from t9;
    insert into t9(name) values("lala");  (id默认是从4开始的)

    truncate t9
    insert into t9(name) values("lala");  (id是重置为0开始的)

テーブルとテーブルの関係が
定義されています。従業員テーブルが定義されています。テーブル
ID名genderdep_namedep_descには多くのフィールドがあります。

テーブルの組織構造はあまり明確ではありません(無視できます)
ハードディスク領域を浪費します(無視できます)
データのスケーラビリティは非常に貧弱です(無視できません)


上記の問題を最適化する方法は、すべてのコードをpyファイルに書き込む方法と似ています。employee
テーブルをemployeeテーブルとdepartmentテーブルに分割します。

Foreginキー外部キー
外部キーは、テーブルと
Foreginキーのテーブル間の関係を構築するために使用されます

テーブル間の関係は最大で4つだけです

一对多关系
    在mysql的关系中没有多对一的说法
    一对多 多对一 都叫一对多
多对多关系
一对多关系
没有关系

1
対多の関係テーブルとテーブルの関係を判断する方法。早い段階で慣れていない場合は、共感の原則に従い、2つのテーブルの観点から検討する必要があります。

例として、従業員テーブルと部門テーブルを取り上げます。
従業員が複数の部門に対応できるかどうか(1つの従業員データが複数の部門データに対応するかどうか)
はできない
(直接結論を出すことはできません。両方のテーブルを完全に検討する必要があります)。 )
次に、部門テーブルに立って、部門
が複数の従業員に対応できるか(部門のデータが複数の従業員データに対応
できる
か)、
従業員テーブルと部門テーブルが一対多であると結論付けることができます。
したがって、テーブルの関係は1対多です

外部キー
11対多のテーブル関係外部キーフィールドは多面的に構築されます
2テーブルを作成するときは、最初に関連テーブルを作成する必要があります
3データを入力するときは、最初に関連テーブルも入力する必要があります
ここに画像の説明を挿入

テーブルの関係を確立するためのSQLステートメント

  create table dep(
        id int primary key auto_increment,
        dep_name char(16),
        dep_desc char(32)
        );      (部门表)
        
    create table emp(
        id int primary key auto_increment,
        name char(16),
        gender enum("male","female","other") default "male",
        dep_id int,
        foreign key(dep_id) references dep(id)
        );      (员工表)

    desc dep;
    desc emp;
    

    insert into emp(name,dep_id) values("nana",1);  直接插入emp表会报错,dep_id是外键字段,关联了部门表

    insert into dep(dep_name,dep_desc) values("外交部","流浪法师"),
    ("教学部","教书育人"),
    ("技术部","技术能力部门");
    
    insert into emp(name,dep_id)values("jason",1),
    ("nana",2),("dada",3),("lala",4);   dep表中只绑定3个id,lala绑定第4个id会报错

    insert into emp(name,dep_id)values("jason",1),
    ("nana",2),("dada",3);
    
    select * from dep;
    select * from emp;

depテーブルのidフィールドを変更します

update dep set id=200 where id=2;   报错,无法更改

depテーブルのデータを削除します

delete from dep;    报错,拒绝修改

テーブル内のデータを変更または削除します
。1最初に教育部門に対応する従業員データを削除してから、部門を削除します。
操作が面倒です。

2データ間には関係があることを実感してください。
更新は同期的に更新され、
削除されると同期的に削除されます。
カスケード更新カスケード削除

foreign key(dep_id) references dep(id) 
on update cascade   # 同步更新(级联更新)
on delete cascade   # 同步删除(级联删除)
create table dep(
    id int primary key auto_increment,
    dep_name char(16),
    dep_desc char(32)
    );

create table emp(
    id int primary key auto_increment,
    name char(16),
    gender enum("male","female","other") default "male",
    dep_id int,
    foreign key(dep_id) references dep(id) 
    on update cascade   # 同步更新(级联更新)
    on delete cascade   # 同步删除(级联删除)
    );

insert into dep(dep_name,dep_desc) values("外交部","流浪法师"),
("教学部","教书育人"),
("技术部","技术能力部门");
insert into emp(name,dep_id)values("jason",1),
("nana",2),("dada",3);

update dep set id=200 where id=2;   # 将id=2的数据修改成id=200
delete from dep where id=1;     # 将id=1的数据删除
select * from dep;
select * from emp;


例としての多対多の関係の本の表と著者の表
ここに画像の説明を挿入

  create table book(
        id int primary key auto_increment,
        title varchar(32),
        price int,
        author_id int,
        foreign key(author_id) references author(id)
        on update cascade   # 同步更新
        on delete cascade   # 同步删除
        );
        
    create table author(
        id int primary auto_increment,
        name varchar(32),
        age int,
        book_id int,
        foreign key(book_id) references book(id)
        on update cascade   # 同步更新
        on delete cascade   # 同步删除
        );

上記の方法を作成すると、2つの側面は互いに関連付けられ
、実際には成功を生み出す方法はありません。
フィールドの本と著者の関係を記録したいだけです。テーブル間の多くの関係、外部キーは2つの元のテーブルの
ニーズで作成されない2つのテーブルのデータ間の関係を格納するために専用の別のテーブルを設定します
ここに画像の説明を挿入

ケースコード表示

create table book(
    id int primary key auto_increment,
    title varchar(32),
    price int);

create table author(
    id int primary key auto_increment,
    name varchar(32),
    age int);

create table book2author(
    id int primary key auto_increment,
    author_id int,
    book_id int,
    foreign key(author_id) references author(id)
    on update cascade
    on delete cascade,
    foreign key(book_id) references book(id)
    on update cascade
    on delete cascade);

desc book2author;

    
book表与author表之间没有直接的关系,book2author这张表作为一张媒介表使用。 
book2author中的book_id与book中的id是一个一对多的关系,
book2author中的author_id与author中的id也是一个一对多的关系。
    insert into book(title,price) values("撩妹大法",9999),("独孤九贱",8888);
    insert into author(name,age) values("nana",16),("dada",18);
    
    select * from book;
    select * from author;
    select * from book2author;
    
    delete from book where id=2;
    select * from book2author;      # 删除book表中的id为2的数据,那么book2author表中的跟book表中id为2关联的数据也被删除了

1対1の関係
ID名年齢アドレス電話趣味の電子メール…
テーブルにフィールドが多すぎる場合、すべてのフィールドを各クエリに使用できるわけではありません

将表一分为二 
    用户表
        用户表
            id name age
        用户详情表
            id addr phone hobby email......
站在用户表
    一个用户表能否对应多个用户详情 不能
站在详情表
    一个详情能否属于多个用户 不能
    
   结论:
    单向的一对多都不成立 那么这个时候两者之间的表关系
    就是一对一
    或者是没有关系(好判断)

顧客テーブルと学生テーブル
は、登録登録
後の学生の間の顧客です(一部の顧客は期間中にサインアップしません)
。1対1の外部キーフィールドはどちらの側にも作成できますが、作成することをお勧めします。クエリの頻度が高いテーブル内
ここに画像の説明を挿入

ケースコードのデモンストレーション

   create table authordetail(
        id int primary key auto_increment,
        phone int,
        addr varchar(64)
        );
    
    create table author1(
        id int primary key auto_increment,
        name varchar(32),
        age int,
        authordetail_id int unique,
        foreign key(authordetail_id) references authordetail(id)
        on update cascade
        on delete cascade
        );
    desc author1;
    desc authordetail;
    

総括する

表关系的建立需要用foreign key
    一对多
        外键字段建在多的一方
    多对多
        自己开设第三张存储
    一对一
        建在任意一方都可以 但是推荐建在查询频率较高的表中

判断表之间的关系方式
    换位思考!!!
    员工与部门
    图书与作者
    作者与作者详情

テーブルを変更する(理解する)

  mysql对大小写是不敏感的(mysql是不区分大小写的)
    修改表名
        alter table 表名 rename 新表名;
        
    增加字段
        alter table 表名 add 字段名 字段类型(宽度) 约束条件;
        alter table 表名 add 字段名 字段类型(宽度) 约束条件 first;     # 新建字段在最前面
        alter table 表名 add 字段名 字段类型(宽度) 约束条件 after 字段名;     # 新建的字段跟在哪个字段名的后面 
    删除字段
        alter table 表名 drop 字段名;
    修改字段
        alter table 表名 modify 字段名 字段类型(宽度)约束条件;     # 修改字段名中的字段类型或者是约束条件
        
        alter table 表名 change 旧字段名 新字段名 字段类型(宽度)约束条件;   # 更换新的字段名,更换新的字段类型和约束条件

表をコピーする(理解する)

我们sql语句的结果其实也是一张虚拟表
	create table 表名 select * from 旧表名;  # 只能复制表结构和数据,不能复制主键 外键 索引...
	create table 表名 select * from 旧表 where 条件;  # 按照条件复制表中的数据建成新表(如果条件不成立,那么会直接复制表结构,数据为空

おすすめ

転載: blog.csdn.net/Yosigo_/article/details/113781956