三、MySQL数据表的基本操作

  在数据库中,数据表是数据库中最重要、最基本的操作对象,是数据存储的基本单位。数据表被定义为列的集合,数据在表中是按照行和列的格式存储的。每一行代表一条唯一的记录,每一列代表记录中的一个域。

一、创建数据表

  在创建完数据库之后,接下来的工作就是创建数据表。所谓创建数据表,指的是在已经创建好的数据库中建立新表。创建数据表的过程是规定数据列的属性的过程,同时也是实施数据完整性(包括实体完整性、引用完整性和域完整性等)约束的过程。

1.1 创建表的语法形式

  数据表属于数据库,在创建数据表之前,应该使用语句“USE <数据库名>”指定操作是在哪个数据库中进行,如果没有选择数据库,会抛出“No database selected”的错误。

  创建数据表的语句为CREATE TABLE,语法规则如下:

CREATE TABLE <表名>
(
字段1 数据类型 [列级别约束条件] [默认值],
字段2 数据类型 [列级别约束条件] [默认值],
......
[表级别约束条件]
);

  使用CREATE TABLE创建表时,必须指定以下信息:

  (1)要创建的表的名称,不区分大小写,不能使用SQL语言中的关键字,如DROP、ALTER、INSERT等。

  (2)数据表中每一个列(字段)的名称和数据类型,如果创建多个列,要用逗号隔开。

  数据表创建完后,可以使用SHOW TABLES;语句查看数据表是否创建成功,结果如下:

1.2 使用主键约束

  主键,又称主码,是表中一列或多列的组合。主键约束(Primary Key Constraint)要求主键列的数据唯一,并且不允许为空。主键能够唯一地标识表中的一条记录,可以结合外键来定义不同数据表之间的关系,并且可以加快数据表查询的速度。主键和记录之间的关系如同身份证和人之间的关系,它们之间是一一对应的。主键分为两种类型:单字段主键和多字段联合主键。

1.2.1 单字段主键

  单字段主键由一个字段组成,SQL语句格式分为以下两种情况。

  (1)在定义列的同时指定主键。

字段名 数据类型 PRIMARY KEY [默认值]

  (2)在定义完所有列之后指定主键。

[CONSTRAINT <约束名>] PRIMARY KEY [字段名]

  上述两个方式执行后的结果是一样的,都会在字段上设置主键约束。

1.2.2 多字段联合主键

  主键由多个字段联合组成。

PRIMARY KEY [字段1,字段2,......,字段n]

  语句执行后,便创建了一个多字段联合主键。

1.3 使用外键约束

  外键用来在两个表的数据之间建立链接,它可以是一列或者多列。一个表可以有一个或多个外键。外键对应的是参照完整性,一个表的外键可以是空值,若不为空值,则每个外键值必须等于另一个表中主键的某个值。

  外键:首先它是表中的一个字段,它可以不是本表的主键,但对应另外一个表的主键。外键主要作用是保证数据引用的完整性,定义外键后,不允许删除在另一个表中具有关联关系的行。外键的作用是保持数据的一致性、完整性。

  主表(父表):对于两个具有关联关系的表而言,相关联字段中主键所在的那个表既是主表。

  从表(子表):对于两个具有关联关系的表而言,相关联字段中外键所在的那个表既是从表。

  创建外键的语法规则如下:

[CONSTRAINT <外键名>] FOREIGN KEY 字段1 [,字段2,......] REFERENCES <主表名> 主键列1 [,主键列2,......]

  “外键名”为定义的外键约束的名称,一个表中不能有相同名称的外键;“字段名”表示子表需要添加外键约束的字段列;“主表名”即被子表外键所依赖的表的名称;“主表列”表示主表中定义的主键列或列组合。

  提示:关联是指在关系型数据库中,相关表之间的联系。它是通过相容或相同的属性或属性组来表示的。子表的外键必须关联父表的主键,且关联字段的数据类型必须匹配,如果类型不一样,则创建子表时,就会出现错误。

1.3.1 创建外键约束(不指定外键名称,数据库自动生成)

CREATE TABLE tb1
(
    id INT AUTO_INCREMENT,
    name VARCHAR(15),
    PRIMARY KEY(ID)
)

CREATE TABLE tb2
(
    id INT AUTO_INCREMENT,
    name VARCHAR(15),
    tb1_id INT,
    PRIMARY KEY(ID),
    FOREIGN KEY (tb1_id) REFERENCES tb1(id) ON DELETE CASCADE ON UPDATE CASCADE
)

1.3.2 创建外键约束(指定外键名称)

CREATE TABLE tb1
(
    id INT AUTO_INCREMENT,
    name VARCHAR(15) NOT NULL,
    PRIMARY KEY(ID)
)

CREATE TABLE tb2
(
    id INT AUTO_INCREMENT,
    name VARCHAR(15) NOT NULL,
    tb1_id INT,
    PRIMARY KEY(ID),
    CONSTRAINT FKname FOREIGN KEY (tb1_id) REFERENCES tb1(id) ON DELETE CASCADE ON UPDATE CASCADE
)

1.3.3 数据表已存在时创建外键约束(不指定外键名称,数据库自动生成)

ALTER TABLE tb2 ADD FOREIGN KEY(tb1_id) REFERENCES tb1(id)

 1.3.4 数据表已存在时创建外键约束(指定外键名称)

ALTER TABLE tb2 ADD CONSTRAINT FKname FOREIGN KEY(tb1_id) REFERENCES tb1(id)

1.4 使用非空约束

  非空约束(Not Null Constraint)指字段的值不能为空。对于使用了非空约束的字段,如果用户在添加数据时没有指定值,数据库系统会报错。

  非空约束的语法规则如下:

字段名 数据类型 NOT NULL

1.5 使用唯一性约束

  唯一性约束(Unique Constraint)要求该列唯一,允许为空,但只能出现一个空值。唯一约束可以确保一列或者几列不出现重复值。

  唯一性约束的语法规则如下:

  (1)定义列的时候直接指定唯一约束

字段名 数据类型 UNIQUE

  (2)在定义完所有列之后指定唯一约束

[CONSTRAINT <约束名>] UNIQUE(字段名)

  UNIQUE与PRIMARY KEY的区别:一个表中可以有多个字段声明为UNIQUE,但只能有一个PRIMARY KEY声明;声明为PRIMARY KEY的列不允许有空值,但是声明为UNIQUE的字段允许空值(NULL)的存在。

1.6 使用默认约束

  默认约束(Default Constraint)指定某列的默认值。

  默认约束的语法规则如下:

字段名 数据类型 DEFAULT 默认值

1.7 设置表的属性值自动增加

  在数据库应用中,经常希望在每次插入新纪录时,系统自动生成字段的主键值。可以通过为表添加AUTO_INCREMENT关键字来实现。默认的,在MySQL中AUTO_INCREMENT的初始值是1,每新增一条记录,字段值自动加1。一个表只能有一个字段使用AUTO_INCREMENT约束,且该字段必须为主键的一部分。AUTO_INCREMENT约束的字段可以是任何整数类型(TINYINT、SMALLINT、INT、BIGINT等)。

  设置表的属性值自动增加的语法规则如下:

字段 数据类型 AUTO_INCREMENT 

1.8 主外键关系的约束

  如果一个子表试图创建一个在主表中不存在的外键值,数据库会拒绝任何的insert或update操作。

  如果主表试图update或者delete任何子表中存在或匹配的外键值,最终动作取决于外键约束定义中的on update和on delete选项。

  on update和on delete都有下面4种动作:

  (1)cascade:主表删除或更新相应的数据行,则子表同时删除或更新与主表相匹配的行,即级联删除、更新;

  (2)set null:主表删除或更新相应的数据行,则子表同时将与主表相匹配的行的外键设置为null。当外键列被设置为not null时无效;

  (3)no action:数据库拒绝删除或更新主表;

  (4)restrict:数据库拒绝删除或更新主表;

  如果未指定on delete或on update的动作,则它们默认动作为restrict,后续想要修改约束动作,需先删除外键约束,然后重新创建外键约束并指定约束动作。

二、查看数据表结构

  使用SQL语句创建好数据表之后,可以查看表结构的定义,以确保表的定义是否正确。在MySQL中,查看表结构可以使用DESCRIBE和SHOW CREATE TABLE语句。

2.1 查看表结构语句DESCRIBE

  DESCRIBE/DESC语句可以查看表的字段信息,其中包括:字段名、字段数据类型、是否为主键、是否有默认值等。语法规则如下:

DESCRIBE 表名;

  或者简写为:

DESC 表名;

2.2 查看表详细结构语句SHOW CREATE TABLE

  SHOW CREATE TABLE语句可以用来显示创建表时的CREATE TABLE语句,语法格式如下:

SHOW CREATE TABLE <表名\G>;

三、修改数据表

  修改表指的是修改数据库中已经存在的数据表的结构。MySQL使用ALTER TABLE语句修改表。常用的修改表的操作有:修改表名、修改字段数据类型或字段名、增加和删除字段、修改字段的排列位置、更改表的存储引擎、删除表的外键约束等。

3.1 修改表名

  MySQL是通过ALTER TABLE语句来实现表名的修改的,具体的语法规则如下:

ALTER TABLE <旧表名> RENAME [TO] <新表名>;

  其中TO为可选参数,使用与否都不影响结果。

3.2 修改字段的数据类型

  修改字段的数据类型,就是把字段的数据类型转换成另一种数据类型。在MySQL中修改字段数据类型的语法规则如下:

ALTER TABLE <表名> MODIFY <字段名> <数据类型>;

  其中“数据类型”指修改后字段的新数据类型。

3.3 修改字段名

  MySQL中修改字段名的语法规则如下:

ALTER TABLE <表名> CHANGE <旧字段名> <新字段名> <新数据类型>;

  其中,“旧字段名”指修改前的字段名;“新字段名”指修改后的字段名;“新数据类型”指修改后的数据类型,如果不需要修改字段的数据类型,可以将数据类型设置成与原来一样,但数据类型不能为空。

3.4 添加字段

  随着业务需求的变化,可能需要在已经存在的表中添加新的字段。一个完整的字段包括字段名、数据类型、完整性约束。添加字段的语法格式如下:

ALTER TABLE <表名> ADD <新字段名> <数据类型> [约束条件] [FIRST|AFTER 已存在字段名];

  新字段名为需要添加的字段的名称;“FIRST”为可选参数,其作用是将新添加的字段设置为表的第一个字段;“AFTER”为可选参数,其作用是将新添加的字段添加到指定的“已存在字段名”的后面。

3.5 删除字段

  删除字段是将数据表中某个字段从表中移除,语法格式如下:

ALTER TABLE <表名> DROP <字段名>;

3.6 修改字段的排列位置

  对于一个数据表来说,在创建的时候,字段在表中的排列顺序就已经确定了。但表的结构并不是完全不可以改变的。

ALTER TABLE <表名> MODIFY <字段1> <数据类型> FIRST|AFTER <字段2>;

  “字段1”指要修改位置的字段,“数据类型”指“字段1”的数据类型,“FIRST”为可选参数,指将“字段1”修改为表的第一个字段,“AFTER 字段2”指将“字段1”插入到“字段2”后面。

3.7 更改表的存储引擎

  存储引擎是MySQL中的数据存储在文件或者内存中时采用的不同技术实现。可以根据自己的需要,选择不同的引擎,甚至可以为每一张表选择不同的存储引擎。

  更改表的存储引擎的语法格式为:

ALTER TABLE <表名> ENGINE=<更改后存储引擎名>;

3.8 删除表的外键约束

  对于数据库中定义的外键,如果不再需要,可以将其删除。外键一旦删除,就会自动解除主表和从表间的关联关系,MySQL中删除外键的语法格式如下:

ALTER TABLE <表名> DROP FOREIGN KEY <外键约束名>;

  “外键约束名”指在定义表时CONSTRAINT关键字后面的参数,可通过SHOW CREATE TABLE查看。

四、删除数据表

  删除数据表就是将数据库中已经存在的表从数据库中删除。注意,在删除表的同时,表的定义和表中所有数据均会被删除。因此,在进行删除操作时,最好对表中的数据做个备份,以免造成无法挽回的后果。

4.1 删除没有被关联的表

  在MySQL中,使用DROP TABLE可以一次删除一个或多个没有被其他表关联的数据表。语法格式如下:

DROP TABLE [IF EXISTS] 表1,表2,...,表n;

  其中“表n”表示要删除的表的名称,可以同时删除多个表。如果要删除的数据表不存在,则MySQL会提示一条错误信息。参数“IF EXISTS”用于删除前判断要删除的表是否存在,加上参数后,再删除的时候,如果表不存在,SQL语句可以顺利执行,但会发出警告(warning)。

4.2 删除被其他表关联的主表

  数据表之间存在外键关联的情况下,如果直接删除父表,结果会显示失败。原因是直接删除,将破坏表的参照完整性。如果必须要删除,可以先删除与它关联的子表,再删除父表,只有这样同时删除了两个表中的数据。但有的情况下可能要保留子表,这是要单独删除父表,只需要将关联的表的外键约束条件取消,然后就可以删除父表,步骤如下:

  (1)删除子表的外键约束;

  (2)删除父表。

posted @ 2021-07-05 12:01  夏末蝉未鸣  阅读(1038)  评论(0编辑  收藏  举报