前に言った制約:
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 条件; # 按照条件复制表中的数据建成新表(如果条件不成立,那么会直接复制表结构,数据为空