Pythonの型制約とデータベースの第四十一章

データベースの種類

https://www.cnblogs.com/clschao/articles/9959559.html
テーブルを作成する
テーブルのテーブル名を作成
データベースday41を作成します。#は、テーブルを作成します
使用day41;#表
`` `のpython

数値型

类型                  大小     范围有-号               范围无-号
tinyint(小整数)      1个字节   (-128~127)              (0~255)
int(整数)            4个字节   (很大的负数~很大的正数)    (0~很大的数)
float(单精度)        4个字节   (255~30)
double(双精度)       8个字节   (255~30)
decimal(准确的小数)            依赖M和D的值              依赖M和D的值
1.整数类型
tinyint
创建有-号
<mysql> create table t1(id tinyint); # 创建有-号
<mysql> insert into t1 values(11); # 可插入-128~127范围的数字
<mysql> insert into t1 values(-200); # 超出范围报错
ERROR 1264 (22003): Out of range value for column 'id' at row 1 # 报错不能插入
<mysql> select * from t1;
+-------+
| monet |
+-------+
|    11 |
+-------+

创建无-号
<mysql> create table t2(id tinyint unsigned); # 创建无-号
<mysql> insert into t2 values(10); # 可插入0~255范围的数字
<mysql> insert into t2 values(-10); # 超出范围报错
ERROR 1264 (22003): Out of range value for column 'id' at row 1 # 报错不能插入
<mysql> select * from t2;
+------+
| id   |
+------+
|   10 |
+------+
1 row in set (0.00 sec)
# 创建表后面不能加,号


int integer  4个字节

float 单点型 (255,30) 255整数+小数位 30小数位
<mysql> create table t3(id float(60,30)); # 60 整数位 30 小数位
<mysql> insert into t3 values(1.111111111111111111);
<mysql> select * from t3;
+----------------------------------+
| id                               |
+----------------------------------+
| 1.111111164093017600000000000000 |
+----------------------------------+
1 row in set (0.00 sec)

double  双精度 (255,30)
<mysql> create table t4(id double(60,30));
<mysql> insert into t4 values(1.111111111111111111);
<mysql> select * from t4;
+----------------------------------+
| id                               |
+----------------------------------+
| 1.111111111111111200000000000000 |
+----------------------------------+
1 row in set (0.00 sec)

decimal 小数 存的字符串 很精准 (65,30)
<mysql> create table t5(id decimal(60,30));
<mysql> insert into t5 values(1.111111111111111111);
<+----------------------------------+
| id                               |
+----------------------------------+
| 1.111111111111111111000000000000 |
+----------------------------------+
1 row in set (0.00 sec)

日付タイプ

date time datetime imestamp year

<mysql> create table t6(d1 year,d2 date,d3 datetime); # 设置三个时间类型
<mysql> insert into t6 values(now(),now(),now()); # 设置当前时间
Query OK, 1 row affected, 1 warning (0.01 sec) # 当前时间报错
<mysql> select * from t6;
+------+------------+---------------------+
| d1   | d2         | d3                  |
+------+------------+---------------------+
| 2019 | 2019-08-30 | 2019-08-30 10:10:25 |
+------+------------+---------------------+
1 row in set (0.00 sec)

** SQLがstrictモードを設定し、オンラインの問題を回避するために、strictモードを使用してください

会话:持续保持通信
sql_mode 配置严格模式,遇到错误就报错
mysql> select @@sql_mode;
+-------------------------------------------------------------------------------------------------------------------------------------------+
| @@sql_mode                                                                                                                                |
+-------------------------------------------------------------------------------------------------------------------------------------------+
| ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION |
+-------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)


全局会话:@@global.sql_mode
<mysql> select @@global.sql_mode;
+-------------------------------------------------------------------------------------------------------------------------------------------+
| @@global.sql_mode                                                                                                                         |
+-------------------------------------------------------------------------------------------------------------------------------------------+
| ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION |
+-------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

永久生效:
Windows 直接打开配置文件,在最后一行添加
设置严格模式
sql_mode = 'STRICT_TRANS_TABLES'
mac下修改成严格模式:
编辑mysql的配置文件
sudo vim /etc/my.cnf
按i进入编辑模式 
配置成严格模式
sql_mode = 'STRICT_TRANS_TABLES'


当前会话变成严格格式:
set session sql_mode = 'STRICT_TRANS_TABLES';
@@sql_mode 约束sql语句的模式
只是开启的这个客户端与服务端通信时会走严格模式
<mysql> set session sql_mode = 'STRICT_TRANS_TABLES';
<mysql> select @@sql_mode;
+---------------------+
| @@sql_mode          |
+---------------------+
| STRICT_TRANS_TABLES |
+---------------------+
1 row in set (0.00 sec)


设置全局会话变成严格模式:
<mysql> set global sql_mode = 'STRICT_TRANS_TABLES';
<mysql> select @@global.sql_mode;
+---------------------+
| @@global.sql_mode   |
+---------------------+
| STRICT_TRANS_TABLES |
+---------------------+
1 row in set (0.00 sec)

#需关闭服务,再次开启链接,才会再次生效

文字列型

char varchar 
区别:存数据的时候在硬盘开的空间不一样
char 定长的 开辟10个字符的空间长度 会浪费空间 建议小数据类型存储
varchar 变长的 开辟空间长度是插入几个用几个 不一定省空间 建议大数据类型存储
会多存一个长度的空间 当char的数据=varchar数据的时候 varchar更占空间 
char
<mysql> create table t7(name char(10));
设置char类型的
插入字符长度 char(10)
<mysql> desc t7;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| name  | char(10) | YES  |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+
1 row in set (0.00 sec)

显示宽度 (4)默认的,非设置的 最长4个 -128
<mysql> desc t1;
+-------+------------+------+-----+---------+-------+
| Field | Type       | Null | Key | Default | Extra |
+-------+------------+------+-----+---------+-------+
| monet | tinyint(4) | YES  |     | NULL    |       |
+-------+------------+------+-----+---------+-------+
1 row in set (0.01 sec)
<mysql> insert into t7 values('1111111');
<mysql> insert into t7 values('111111111111');
ERROR 1406 (22001): Data too long for column 'name' at row 1


varchar
<mysql> create table t8(name varchar(10));
设置varchar类型的

列挙型およびコレクション型

枚举类型:
enum
插入单选
CREATE TABLE shirts (
name VARCHAR(40),
size ENUM('x-small', 'small', 'medium', 'large', 'x-large')
                );
    INSERT INTO shirts (name, size) VALUES ('dress shirt','large'), ('t-shirt','medium'),('polo shirt','small');


集合类型:
set
插入多选

集合类型(set)
A SET column can have a maximum of 64 distinct members.
示例:
    CREATE TABLE myset (col SET('a', 'b', 'c', 'd'));
    INSERT INTO myset (col) VALUES ('a,d'), ('d,a'), ('a,d,a'), ('a,d,d'), ('d,a,d');

制約クラス

约束条件:
数据不能一样,一样会报错

约束不能为空:name char(5) not null
<mysql> create table t11(id int,name char(5) not null);

<mysql> insert into t11 values('xx');
ERROR 1136 (21S01): Column count doesn't match value count at row 1 # 必须制定字段

不制定字段需要都输入
<mysql> insert into t11(name) values('xx');
Query OK, 1 row affected (0.00 sec)
<mysql> select * from t11;
+------+------+
| id   | name |
+------+------+
| NULL | xx   |
+------+------+
1 row in set (0.00 sec)

<mysql> insert into t11(id) values(1);
ERROR 1364 (HY000): Field 'name' doesn't have a default value # name 不能为空,现在没有值

<mysql> create table t12(id int,name char(10) default);
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ')' at line 1 # 没有设置默认值
<mysql> create table t12(id int,name char(10) default 'xx'); # default 'xx'设置默认值
Query OK, 0 rows affected (0.02 sec)
<mysql> desc t12;
+-------+----------+------+-----+---------+-------+
| Field | Type     | Null | Key | Default | Extra |
+-------+----------+------+-----+---------+-------+
| id    | int(11)  | YES  |     | NULL    |       |
| name  | char(10) | YES  |     | xx      |       |
+-------+----------+------+-----+---------+-------+
2 rows in set (0.01 sec)

<mysql> create table t13(id int,name char(10) not null default 'xx');
Query OK, 0 rows affected (0.03 sec)

<mysql> insert into t13(id) values(1);
Query OK, 1 row affected (0.00 sec)
<mysql> select * from t13;
+------+------+
| id   | name |
+------+------+
|    1 | xx   |
+------+------+
1 row in set (0.00 sec)

unique 唯一数据不能重复
<mysql> create table t14(id int,name char(10) unique);
<mysql> insert into t14 values(1,'xxxx');
ERROR 1062 (23000): Duplicate entry 'xxxx' for key 'name' # name的值有重复的

primary key 主键不能为空唯一
<mysql> create table t15(id int primary key,name char(10));
<mysql> insert into t15(name) values('xxx');
ERROR 1364 (HY000): Field 'id' doesn't have a default value # 必须有id键
<mysql> insert into t15 values(1,'xxx');
Query OK, 1 row affected (0.00 sec)

<mysql> insert into t15 values(1,'xxxx');
ERROR 1062 (23000): Duplicate entry '1' for key 'PRIMARY' # id必须唯一

auto_increment自增
<mysql> create table t15(id int auto_increment,name char(10));
ERROR 1075 (42000): Incorrect table definition; there can be only one auto column and it must be defined as a key # 必须有主键

<mysql> create table t16(id int primary key auto_increment,name char(10)); # 设置主键和自增
<mysql> insert into t16(name) values('xxx');
Query OK, 1 row affected (0.00 sec)
<mysql> select * from t16;
+----+------+
| id | name |
+----+------+
|  1 | xxx  |
+----+------+
1 row in set (0.00 sec)
<mysql> insert into t16(name) values('xxxx');
Query OK, 1 row affected (0.00 sec)
<mysql> select * from t16;
+----+------+
| id | name |
+----+------+
|  1 | xxx  |
|  2 | xxxx |
+----+------+
2 rows in set (0.00 sec)
# id 自动加1

外部キー、外部キーフィールドの関連テーブルとテーブル

强制约束效果,强制关联id等字段,类似指针,指向另一个表的id
不能超出id的最大值
一对一
一对多
多对多

一对一
先创建出版社表,否则报错
<mysql> create table publish(id int primary key auto_increment,name char(10));
在创建书表,关联字段建立连接 外键写法
delete 
强制约束效果删除错误 不能删除或者父级类的键
一对一关系
学生表(student)和客户表(customer)
create table student(
        id int primary key,
        name char(10),
        cid int unique,
        foreign key(cid) references customer(id)
        );

一对多
在多的表里面添加一个字段,并给这个字段加foreign key,比如:
出版社对应书籍是多对一的关系
1.先创建出版社表  publish表
2.创建书籍表,外键写法:
    create table book(
        id int primary key,
        name char(10),
        pid int,
        foreign key(pid) references publish(id)
        );
先给出版社插入数据 否则会报错


多对多
通过id对应两个表的id,这个表强制约束另外两个表
先创建作者表
再创建书籍表
(都可以)
最后第三张表来完整两者的约束作者和书籍表
create table authortobook(
        id int primary key,
        author_id int,
        book_id int,
        foreign key(author_id) references author1(id),
        foreign key(book_id) references book1(id)
        );

おすすめ

転載: www.cnblogs.com/zhangshan33/p/11444422.html