表定义

只有成功创建数据库后,才能创建数据表,数据表是字段的集合,在表中数据按行和列的格式存储

创建表

MySQL 使用 CREATE TABLE 创建表。其中有多个选择,主要由表创建定义(create definition)、表选项定义(table options) 和区分选项(partition options)等内容构成。

表创建定义:由表列的名字、列的定义集可能的一个空值声明、一个完整性约束或表索引项组成,表索引项主要定义表的索引、主键、外键等。

语法结构:

CREATE[TEMPORARY]TABLE tbl_name
(
字段名|数据类型[列级完整性约束条件][默认值]
[,字段名2 数据类型[列级完整性约束条件][默认值]]
[,....]
[,表级完整性约束条件]
)[ENGINE=引擎类型]

Example:

新建一个客户信息

mysql> USE mysql_test
Database changed
mysql> CRATE TABLE customers
->(
-> cust_id INT NOT NULL AUTO_INCREMENT,
-> cust_name CHAR(50) NOT NULL,
-> cust_sex CHAR(1) NOT NULL DEFAULT 0,
-> cust_address CHAR(50) NULL
-> cust_contact CHAR(50) NULL
-> PRIMARY KEY(CUST_ID)
->)
Query OK, 0 rows affected(0.11 sec)

临时表与持久表

TEMPORARY:表示临时表,如果不选用则位持久表。

持久表一直存在,多个用户或应用程序可同时使用持久表,如果只需临时存放数据可添加 TEMPORARY 关键字

临时表只能对创建它的用户可见,断开数据库连接时,表会自动清除

数据类型

数据类型指系统中所允许的数据的类型。每列都应有适当的数据类型,来限制或允许该列的数据。 建表时必须为每列指定正确的数据类型及数据长度 (CHAR(50))

MySQL 主要数据类型:

  • 数值类型:整型 int、浮点 double、布尔 bool
  • 日期和时间类型:日期型、时间戳 timestamp、时间型 time
  • 字符串类型:定长字符类型char、可变长字符类型varchrar
  • 空间数据类型:单个几何类型 GEOMETRY等

关键字 AUTO_INCREMENT

AUTO_INCREMENT: 表中数据类型为整型的列设置自增属性 (++i),从当前指或 1 开始,表中只能有一个 AUTO_INCREMENT。

当一个表列被指定为 AUTO_INCREMENT 后,其值可被覆盖,即可在表数据插入语句中为该列指定一个值(必须唯一),则该值将替换系统自动生成的值,后续增量基于该插入的值

指定默认值

DEFAULT:用于指定MySQL在未给值的情况下默认的值(DEFAULT 0)

如果未指定默认值,则自动为其分配一个值,如若该列可取值NULL,则默认NULL,若定义 NOT NULL,则默认取决于该列的类型:

  • 一个没有声明 AUTO_INCREMENT 列 为数字类型,默认 0
  • 一个 AUTO_INCREMENT 列 默认为顺序中的下一个值
  • 对于除 TIMESTAMP 以外的日期和时间类型,默认为该类型适当的'零'值、
  • 对于表中第一个 TIMESTAMP 列,默认值为当前日期和时间

NULL值

NULL:没有值或缺值,允许NULL的列,插入行时可以不给该列的值;不允许NULL值的列,则该列必须有数据

NULL''是不对等的 NOT NULL 列中允许'' 不允许 NULL

主键

PRIMARY KEY :指定主键,主键必须唯一且不能为NULL, 如果是单列,值必须唯一,如果是组合列,则其组合的值必须唯一

更新表

通过使用 ALTER TABLE 来修改数据库

  • ADD[COLUMN]:新增表列,可增多列使用逗号分隔即可

    Example:
mysql> ALTER TABLE mysqle_test.customers
-> ADD COLUMN cust_city char(10) NOT NULL DEFAULT'ShenZhen' AFTER cust_sex;
Query OK,0 rows affected(0.61 sec)
Records:0 Duplicates:0 Warning:0

AFTER:将新增的列添加到cut_sexl 列之后

FIRST:将新增的列添加到表的第一列

若使用上述关键字则将新增的列添加至表最后

类似的 可以使用 ADDPRIMARY KEY 、ADDFOREIGN KEY 、ADD INDEX 添加对应的 主键、外键、索引

  • CHANGE[COLUMN]: 修改表中列的名称或数据类型,可修改多列使用逗号分隔即可
mysql> ALTER TABLE mysqle_test.customers
-> CHANGE COLUMN cust_sex sex char(1) NULL DEFAULT 'M'
Query OK,0 rows affected(0.66 sec)
Records:0 Duplicates:0 Warning:0

如果将数据类型更换,可能会丢失该列原有的数据,如果视图改变的数据类型于原有的数据类型不兼容,则SQL命令不会执行,且抛出错误。

再兼容的情况下,该列的数据可能会被截断,如:一列的数据类型为 varchart(10),改为char(1),则该列中的数据'ShenZhen'会变为'S'

  • ALTER [COLUMN]: 修改或删除指定列的默认值
mysql> ALTER TABLE mysqle_test.customers
-> ALTER COLUMN cust_city SET DEFAULT 'ShangHai'
Query OK,0 rows affected(0.36 sec)
Records:0 Duplicates:0 Warning:0
  • MODIFY [COLUMN]: 修改指定列的数据类型,通过 'FIRST' 或 'AFTER' 修改列的位置
mysql> ALTER TABLE mysqle_test.customers
-> MODIFY COLUMN cust_name char(30) FIRST
Query OK,0 rows affected(0.20 sec)
Records:0 Duplicates:0 Warning:0
  • DROP [COLUMN]: 删除列,该列所有数据一并删除
mysql> ALTER TABLE mysqle_test.customers
-> DROP COLUMN cust_city
Query OK,0 rows affected(0.42 sec)
Records:0 Duplicates:0 Warning:0

同样 可使用 DROP PRIMARY KEY 、DROP FOREIGN KEY、DROP INDEX 删除对应的主键、外键、索引

  • RENAME[TO]:表重命名
mysql> ALTER TABLE mysqle_test.customers
-> RENAME TO
Query OK,0 rows affected(0.42 sec)

重命名表

除了 ALTER TABLE 中的 RENAME TO 修改表名,还可通过 RENAME TABLE 来修改单张和多张表(以逗号分隔)

mysql> RENAME TABLE mysql_test.back.customers TO mysqle_test.customers

删除表

DROP[TEMPORARY]TABLE[IF EXISTS]删除一个已存在的表,可以删除多张表,前提操作人必须有权限,但是操作人在该张表上的权限不会被删除

查看表

  • SHOW [FULL] TABLES [{FROM|IN}db_name] [LIKE'pattern'|WHERE expr]: 显示指定数据库中所有表名

Example:

mysql> USE mysql_test
Database changed
mysql> SHOW TABLES:
Tables_in_mysql_test
customers
1 row in set <0.01 sec>
  • SHOW [FULL] COLUMNS {FROM|IN}tb_name[{FROM|IN}db_name] 或 {DESCRIBE|DESC} tbl_name[col_name|wild]: 显示指定数据库表结构。

MySQL 支持使用 DESCRIBE 代替 SHOW COLUMNS FROM 来查看表结构

Example:

mysql> DESC mysql_test.custormes
Field Type Null key Default Extra
cust_id int<11> NO PRI NULL auto_increment
cust_name char<50> NO Null
cust_sex int<1> NO 0 3 row in set <1.56 sec>

Owen 的个人博客

博客园

MySQL的表定义语法的更多相关文章

  1. mysql建表基本语法

    mysql添加约束的两种条件: ------表的内部添加(约束) 列名1 数据类型 (int) primary key auto_increment,---主键默认不能为空的 列名2 数据类型 not ...

  2. MySQL的数据库定义语法

    创建数据库 在MySQL中,使用 CREATE DATABASE 或 CREATE SCHEMA 语句创建数据库 语法结构: CREATE {DATABASE|SCHEMA}[IF NOT EXIST ...

  3. MYSQL 查看表定义的 4 种方法

    方法 1. show create table table_name;可以用这个看表的代码. show create table Strings; 方法 2. show full columns fr ...

  4. linux mysql修改数据表结构语法

    MySQL修改表的语法=========================增加列[add 列名]=========================①alter table 表名 add 列名 列类型 列 ...

  5. Mysql基础--表的操作

    1.表的基本概念 每一行代表一条唯一的记录,每一列代表记录中的一个字段. 2.创建表 例子: 3.查看表结构 (1)DESCRIBE语句查看表定义 语法: 例子: (2)SHOW CREATE TAB ...

  6. MySQL表定义缓存

    表定义 MySQL的表包含表名,表空间.索引.列.约束等信息,这些表的元数据我们暂且称为表定义信息. 对于InnoDB来说,MySQL在server层和engine层都有表定义信息.server层的表 ...

  7. MySQL 建表语句 create table 中的列定义

    MySQL 建表语句 create table 中的列定义: column_definition: data_type [NOT NULL | NULL] [DEFAULT default_value ...

  8. Mysql 会导致锁表的语法

    最近再找一些Mysql锁表原因,整理出来一部分sql语句会锁表的,方便查阅,整理的不是很全,都是工作中碰到的,会持续更新 笔者能力有限,如果有不正确的,或者不到位的地方,还请大家指出来,方便你我,方便 ...

  9. MySQL的表分区详解

    这篇文章主要介绍了MySQL的表分区,例如什么是表分区.为什么要对表进行分区.表分区的4种类型详解等,需要的朋友可以参考下 一.什么是表分区通俗地讲表分区是将一大表,根据条件分割成若干个小表.mysq ...

随机推荐

  1. C# 自然周,月,季度计算。

    /// <summary> /// 判断时间是否和服务器时间是一天 /// </summary> /// <param name="cs">&l ...

  2. hibernate的查询方式的介绍(一)

    1.对象导航查询 2.OID查询 3.hql(hibernate query language)查询 4.QBC查询 5.本地sql查询 在这里先介绍其中两种 1.hibernate的对象导航查询 ( ...

  3. ARTS-S golang定义类

    package main import "fmt" type Student struct { Num int64 Name string } func(s *Student) s ...

  4. Socket无法通过防火墙的问题

    无论是配好端口还是例外的应用程序都不行 更改本地终结点为 socket.Bind()); IPAddress.Any 不要使用127.0.0.1 不要使用127.0.0.1 不要使用127.0.0.1

  5. 使用iCamera 测试mt9d111 200w高分辨率摄像头小结

    使用iCamera 测试mt9d111 200w高分辨率摄像头小结 先看下产品特性 安装效果 根据前面博客的经验,该摄像头,默认配置即有输出,分辨率为800*600,yuv 于是可以写 如果使用默认配 ...

  6. IP,MAC

    MAC寻址与IP寻址 两者是协议上的区分,MAC地址是网卡的物理地址,是提供二层交换机转发数据的,交换机会在自己的内部形成一个MAC地址表,然后根据这个表转发数据包:再者,如果说网络规模大一点的话,机 ...

  7. 551. 学生出勤纪录 I

    给定一个字符串来代表一个学生的出勤纪录,这个纪录仅包含以下三个字符: 'A' : Absent,缺勤 'L' : Late,迟到 'P' : Present,到场 如果一个学生的出勤纪录中不超过一个' ...

  8. scrapy的使用-Pipelines

    #------------------简单的对item操作方式----------------------------# import json class QsbkPipeline(object): ...

  9. Vue项目中实现用户登录及token验证

    学习博客:https://www.cnblogs.com/web-record/p/9876916.html

  10. Django对DateTimeField时间字段查询QuerySet为空的解决方案

    今天在用的Django中的filter()方法对DateTimeField字段查询时碰到了问题,抓耳挠腮一下午,终于解决了,我觉得花了一下午的时间怎么着也得记录下吧(无语)...... 问题描述 : ...