一般的なデータ型と制約

一般的なデータ型と制約

データの種類

デジタルタイプ

1.tinyint:1个字节,有符号:-128~127,无符号:0~255
2.smallint:2个字节
3.mediumint:3个字节
4.int:4个字节
5.bigint:8个字节
6.float:最大总位数m 255,小数位d 30
7.double:最大总位数m 255,小数位d 30
8.decimal:最大总位数m 65,小数位d 30。精度高

# int(n):n并不代表能够存储的最大长度,只有在定义zerofill时有用,不满足长度就在前面补零
create table t(num int(5) zerofill unsigned not null);
insert into t values(12345),(123);
mysql> select * from t;
+--------+
| num    |
+--------+
| 123456 |
|  00123 |
+--------+

文字型

1.char(n):n表示能够存储的字符长度,不加长度时默认为1,最大可存255个字符
2.varchar(b):n表示能够存储的字符长度,必须要加长度,能存的长度<21845个字符
3. text:可以用来存在大量的字符
4.enum('man',"woman","other")  枚举,多选一
5.set('man','woman','other')  集合,可以选多个

create table char_test(name char(3));  # 只能保存3个字符
insert into char_test values("123"),('12'),("1234"),("你是谁呀"),("你");  # 在严格模式下会提示Date too long 错误

mysql> select * from char_test;
+-----------+
| name      |
+-----------+
| 123       |
| 12        |
| 123       |
| 你是谁    |
| 你        |
+-----------+
insert into char_test values("123"),("12"),("你是谁"),("你");  # 插入指验证是字节长度还是字符长度。可以插入3个中文字符。所以是指存储的字符长度

mysql> select * from char_test;
+-----------+
| name      |
+-----------+
| 123       |
| 12        |
| 123       |
| 你是谁    |
| 你        |
| 123       |
| 12        |
| 你是谁    |
| 你        |
+-----------+
select length(name) from char_test;  # 查看字节长度

mysql> select length(name) from char_test;
+--------------+
| length(name) |
+--------------+
|            3 |
|            2 |
|            3 |
|            9 |
|            3 |
|            3 |
|            2 |
|            9 |
|            3 |
+--------------+
select char_length(name) from char_test;  # 查看字符长度

mysql> select char_length(name) from char_test;
+-------------------+
| char_length(name) |
+-------------------+
|                 3 |
|                 2 |
|                 3 |
|                 3 |
|                 1 |
|                 3 |
|                 2 |
|                 3 |
|                 1 |
+-------------------+
create table varchar_test(name varchar(5));

mysql> show tables;
+---------------+
| Tables_in_db1 |
+---------------+
| char_test     |
| varchar_test  |
+---------------+
insert into varchar_test value("你是谁的谁");

mysql> select * from varchar_test;
+-----------------+
| name            |
+-----------------+
| 你是谁的谁      |
+-----------------+
char存取速度快,varchar会用1字节来存数据的长度,超过255个就用2个字节来存长度。所以varchar存取速度慢

char存的时候会存定长字符长度,但是取的时候会很不要脸的把末尾的空格去掉。可以使用sql_mode=PAS_CAHR_TO_FILL_LENGTH让它现出原形长度,在查询的时候用="李杰"可以查到,但是like"李杰"查询不到,通常不这么做

日付時刻タイプ

日期类型
1.year:年
2.data:日期
3.time:时间
4.datetime:占8个字节
5.timestamp:占4个字节

show variables like "sql_mode";

mysql> show variables like "sql_mode";
+---------------+------------------------+
| Variable_name | Value                  |
+---------------+------------------------+
| sql_mode      | NO_ENGINE_SUBSTITUTION |
+---------------+------------------------+
set sql_mode = strict_trans_tables;  # 设置严格模式

mysql> set sql_mode = strict_trans_tables;
Query OK, 0 rows affected (0.00 sec)

mysql> show variables like "sql_mode";
+---------------+---------------------+
| Variable_name | Value               |
+---------------+---------------------+
| sql_mode      | STRICT_TRANS_TABLES |
+---------------+---------------------+
set sql_mode = ansi;  # 设置非严格模式

mysql> show variables like "sql_mode";
+---------------+------------------------+
| Variable_name | Value                  |
+---------------+------------------------+
| sql_mode      | NO_ENGINE_SUBSTITUTION |
+---------------+------------------------+
1 row in set (0.00 sec)

制約

not null;非空
————————————————————————————————————————————————————————————
default:默认值
————————————————————————————————————————————————————————————
unique key:唯一约束
    * id int unique 或则unique(id):单一唯一
    * unique(name,age):联合唯一,只有两字段都相同时为重复
————————————————————————————————————————————————————————————

primary key:主键约束,对于innodb存储引擎来说,一张表内必须有一个主键
    * id int primary key或则primary key(id):单列主键
    * primary key(name,age):复合主键,只有两字段都相同时为重复

auto_incrememt:自动增长:可以自定义增长,与primary key搭配使用
    * show variables like "auto_incr%";
    mysql> show variables like "auto_incr%";
    +--------------------------+-------+
    | Variable_name            | Value |
    +--------------------------+-------+
    | auto_increment_increment | 1     |  # 步长
    | auto_increment_offset    | 1     |  # 起始偏移量位置,必须小于等于步长
    +--------------------------+-------+
    set global auto_increment_increment = 5;  # 全局改
    set session auto_increment_increment = 3;  # 会话层改,下次回到默认值
————————————————————————————————————————————————————————————

foreign key(id) references biao(id)  # 外键约束,建立表之间的关系
on delete cascade  # 级联删除,删除主表时,从表跟着删除
# 建立表
    * 先建被关联的表,并且保证被关联的字段唯一
    * 再建关联的表:从表
# 插入表
    * 先往被关联的表插入数据
    * 再往关联表插入记录
# 删除、更新数据
    * 先删除、更新先操作关联表
    * 再操作被关联的表
    * 用了on delete|update cascade就可以先操作被关联的主表

おすすめ

転載: www.cnblogs.com/zuihoudebieli/p/11375245.html