初识Mysql(part14)--我需要知道的6个关于创建表的小知识

学习笔记,以代码和例子堆砌而成,方便查阅。
参考书籍:《Mysql必知必会》等
要点:CREATE TABLE、主键、NULL、AUTO_INCREMENT、默认值、引擎


  • 创建一个表

Mysql不仅用于表数据操控,还可以用来执行数据库和表的所有操作,包括表本身的创建和处理。

我们利用CREATE TABLE语句创建一个叫test01的表:

CREATE TABLE test01(id int AUTO_INCREMENT,
pro_version int NOT NULL,
price int NULL,
pro_num int NULL,
PRIMARY KEY (id))ENGINE=InnoDB;

如果创建新表时,表名已经存在了,那么mysql就会报错。比如我们在Mysql中重新输入上面的表创建语句,看一下运行信息:

Error Code: 1050. Table 'test01' already exists

mysql报出错误信息,并提示我们test01表已经存在了。


如果我们仅仅想在一个表不存在时创建它,需要在TABLE关键字后给出IF NOT EXISTS。这样做不是检查已有的表的模式是否与我们打算创建的表的模式相匹配,而是查看表名是否存在,并仅在表名不存在时创建它。

我们再创建一个叫test01的表(这个表和先前创建的test01表的模式不同),并使用IF NOT EXISTS

CREATE TABLE IF NOT EXISTS test01(id int AUTO_INCREMENT,
pro_version int NOT NULL,
price int NULL,
PRIMARY KEY (id))ENGINE=InnoDB;

运行信息:

0 row(s) affected, 1 warning(s): 1050 Table 'test01' already exists

我们看到mysql没有报错,只是给了警告,告诉我们,test01表已经存在了。


  • 使用NULL值

所谓NULL值就是没有值或缺失值,允许NULL值的列也允许在插入行时不给出该列的值。不允许NULL值的列不接受该列出现没有值的行,换句话说,在插入或更新行时,该列必须有值。

创建test02表,其中除id列,所有列都允许NULL值

CREATE TABLE test02(id int NOT NULL AUTO_INCREMENT,
pro_version int NULL,
price int NULL,
pro_num int NULL,
PRIMARY KEY (id));

注意!不要把NULL值与空串相互混淆,空串是一个有效的值,它不是无值,如果指定''那么在NOT NULL中是允许的。


  • 主键 PRIMARY KEY

表中的每个行必须有唯一的主键值。如果主键使用单个列,则它的值必须唯一;如果使用多个列,则这些列的组合值必须唯一。

我们创建test03表,并指定两列为主键

CREATE TABLE test03(
pro_version int NOT NULL,
price int NOT NULL,
pro_num int NULL,
PRIMARY KEY (pro_version,price));

注意!主键中不能出现有NULL值的列,所以允许NULL值的列不能作为主键,否则就会报错。比如:

CREATE TABLE test04(
pro_version int NOT NULL,
price int NOT NULL,
pro_num int NULL,
PRIMARY KEY (price,pro_num));

运行信息:

Error Code: 1171. All parts of a PRIMARY KEY must be NOT NULL; if you need NULL in a key, use UNIQUE instead

我们看到运行信息里一句话if you need NULL in a key, use UNIQUE instead,它表示如果我们想要键中存在NULL值,则可以使用唯一约束UNIQUE来替代。

这个UNIQUE是啥呢? 唯一约束(Unique Key),即要求被设置的列的值必须唯一,索引列的值允许有空值,但只能出现一个空值。唯一约束可以确保一列或者几列不出现重复值。

我们试一下这个UNIQUE:

CREATE TABLE test04(
pro_version int NOT NULL,
price int NOT NULL,
pro_num int NULL,
UNIQUE KEY (price,pro_num));

运行结果:

15:37:06	CREATE TABLE test04( pro_version int NOT NULL, price int NOT NULL, pro_num int NULL, UNIQUE KEY (price,pro_num))	0 row(s) affected	0.093 sec

我们看到没有报错。

那么UNIQUE和PRIMARY有啥区别和联系呢?

笔者在网上找到了一张较为直观、清晰的表


  • AUTO_INCREMENT关键字

如果设置某列为AUTO_INCREMENT的话,那么AUTO_INCREMENT将高速Mysql,本列每增加一行时自动增量。每次执行一个INSERT操作时,Mysql自动对该列增量。每个表只允许一个AUTO_INCREMENT列,并且它必须被索引。

PS:上面创建的表里面都有AUTO_INCREMENT关键字,这里就不举例了。


  • 设置默认值

创建test05表,除了主键以外,都设置默认值。

CREATE TABLE test05(id int NOT NULL AUTO_INCREMENT,
pro_version int NOT NULL DEFAULT 0,
price int NOT NULL DEFAULT 0,
PRIMARY KEY (id));

我们试着向test05表中添加数据行

INSERT INTO test05(price) values (10);

查看表:

# id, pro_version, price
'1', '0', '10'

可以看到,虽然我们在插入数据时,没有填入pro_version的值,但是mysql还是自动帮我们填入了默认值0


  • 引擎

可以看到,我们在创建test01表时,在代码末尾是以ENGINE=InnoDB结束的,它表示我们将使用InnoDB引擎去管理和处理数据。

Mysql中有很多引擎,我们可以按照自己的需求,去选择引擎。以下是几个常用的引擎:

引擎 特点
InnoDB 支持事务;外键约束;不支持全文搜索;适合处理多重并发的更新请求
Memory 功能等同于MyIsam,由于数据存储在内存中,速度快
MyIsam 不支持事务;不支持外键;查询速度很快;对表进行加锁;支持全文搜索
发布了219 篇原创文章 · 获赞 102 · 访问量 9万+

猜你喜欢

转载自blog.csdn.net/m0_37422217/article/details/105491333