MySQL 数据表基本操作(三)

数据表的基本操作

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

创建数据表

  • 概念:所谓创建数据表,指的是在已经创建好的数据库中建立新表。创建数据表的过程是规定数据列的属性的过程,同时也是实施数据完整性(包括实体完整性引用完整性域完整性等)约束的过程。

创建表的语法格式

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

  • 创建数据表的语句格式如下:

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

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

    • 要创建的表的名称,不区分大小写,不能使用 SQL 语言中的关键字,如 DROPALTERINSERT 等。
    • 数据表中的每一列(字段)的名称和数据类型。如果创建多个列,就要用逗号隔开。
  • 当执行完创建数据表语句后,查看数据表是否创建成功的语句格式如下:

    SHOW TABLES;
    

使用主键约束

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

    • 单字段主键

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

      1. 在定义列的同时指定主键,语法规则如下:

        字段名 数据类型 PRIMARY KEY [默认值]
        
      2. 在定义完所有列之后指定主键,语法如下:

         [CONSTRAINT <约束名>] PRIMARY KEY ([字段名])
        
      
      
    • 多字段联合主键

      主键由多个字段联合组成,语法规则如下:

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

使用外键约束

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

  • 外键首先是表中的一个字段,可以不是本表的主键,但要对应另外一个表的主键。主要作用是保证数据引用完整性,定义外键后,不允许删除在另一个表中具有关键关系的行。外键的作用是保存数据的一致性完整性。例如,部门表 tb_dept 的主键是 id,在员工表 tb_emp5 中有一个健 depId 与这个 id 关联。

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

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

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

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

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

  • 关联指的是在关系型数据库中,相关表之间的联系。它是通过相容相同属性属性组来表示的。子表外键必须关联父表主键,且关联字段数据类型必须匹配,如果类型不一样,那么创建子表时会出现错误"ERROR 1005 (HY000):Can't create table 'database.tablename'(errno:150)"。

  • 外键功能:

    • 阻止执行:

      从表插入新行,其外键值不是主表的主键值便阻止插入;

      从表修改外键值,新值不是主表的主键值便阻止修改;

      主表删除行,其主键值在从表里存在便阻止删除(要想删除,必须先删除从表的相关行);

      主表修改主键值,旧值在从表里存在便阻止修改(要想修改,必须先删除从表的相关行)。

    • 级联执行:

      主表删除行,连带从表的相关行一起删除;

      主表修改主键值,连带从表相关行的外键值一起修改。

使用非空约束

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

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

    字段名 数据类型 not null
    

使用唯一性约束

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

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

    • 在定义完列之后直接指定唯一约束,语法规则如下:

      字段名 数据类型 UNIQUE
      
    • 在定义完全部列之后指定唯一约束,语法规则如下:

      [CONSTRAINT <约束名>] UNIQUE(<字段名>)
      
  • UNIQUEPRIMARY KEY 的区别是:一个表中可以有多个字段声明为 UNIQUE,但只能有一个 PRIMARY KEY 声明;声明为 PRIMARY KEY 的列不允许有空值,但是声明为 UNIQUE 的字段允许空值NULL)的存在。

使用默认约束

  • 默认约束(Default Constraint)指定某列的默认值。列如,男性同学较多,性别就可以默认为’男‘。如果插入一条新的记录时没有为这个字段赋值,那么系统会自动为这个字段赋值为’男‘。

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

    字段名 数据类型 DEFAULT 默认值
    

设置表的属性值自动增加

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

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

    字段名 数据类型 AUTO_INCREMENT
    

查看数据表的结构

查看表的基本机构语句 DESCRIBE

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

    DESCRIBE 表名;
    

    或者简写为:

    DESC 表名;
    
  • 执行查看结构语句后,其中,各个字段的含义分别解释如下:

    • NULL:表示该列是否可以存储 NULL 值
    • Key:表示该列是否已编制索引PRI 表示该列是表主键的一部分;UNI 表示该列是 UNIQUE 索引的一部分;MUL 表示在列中某个给定值允许出现多次。
    • Default:表示该列是否有默认值,如果有的话值是多少。
    • Extra:表示可以获取的与给定列有关的附加信息,例如 AUTO_INCREMENT 等。

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

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

    SHOW CREATE TABLE <表名\G>;
    
  • 使用 SHOW CREATE TABLE 语句,不仅可以查看表创建时候的详细语句,还可以查看存储引擎字符编码。(提示:如果不加 ‘\G’ 参数,那么显示的结果可能非常混乱,加上参数 ‘\G’ 之后,可使显示结果更加直观、易于查看。)

修改数据表

修改表名

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

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

    其中,TO 为可选参数,使用与否均不影响结果。且修改表名并不修改表的结构,因此修改名称后的表和修改名称前的表的结构必然是相同的

修改字段的数据类型

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

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

    其中,“表名”是指要修改数据类型的字段所在表的名称,“字段名”是指需要修改的字段,“数据类型”是指修改后字段的新数据类型

修改字段名

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

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

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

  • CHANGE 也可以只修改数据类型,实现和 MODIFY 同样的效果,方法是将 SQL 语句中的“新字段名”和“旧字段名”设置为相同的名称,只改变“数据类型”。

  • 提示:由于不同类型的数据在机器中存储的方式及长度并不相同,修改数据类型可能会影响到数据表中已有的数据记录,因此当数据库表中已经有数据时,不要轻易修改数据类型。

添加字段

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

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

    新字段名为需要添加的字段的名称;“FIRST”为可选参数,其作用是将新添加的字段设置为表的第一个字段;“AFTER”为可选参数,其作用是将新添加的字段添加到指定的“已存在字段名”的后面。(提示:“FIRST”或“AFTER 已存在字段名“用于指定新增字段在表中的位置,如果 SQL 语句中没有这两个参数,将默认将新添加的字段设置为数据表的最后列)。

删除字段

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

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

    "字段名"指需要从表中删除的字段的名称。

修改字段的排列位置

  • 对于一个数据表来说,在创建的时候,字段在表中的排列顺序就已经确定了。但表的结构并不是完全不可以改变的,可以通过 ALTER TABLE 来改变表中字段的相对位置。语法格式如下:

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

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

更改表的存储引擎

  • 更改表的存储引擎的语法格式如下:

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

删除表的外键约束

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

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

    外键约束名“指在定义表时 CONSTRAINT 关键字后面的参数。

删除数据表

删除没有被关联的表

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

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

    其中,”表 n“指要删除的表的名称,后面可以同时删除多个表,只需要将要删除的表名一次写在后面,相互之间用逗号隔开即可。如果要删除的数据表不存在,则 MySQL 会提示一条错误信息,”ERROR 1051(42S02):Unknown table ‘表名’ “。参数”IF EXISTS“用于在删除前判断删除的表是否存在,加上该参数后,再删除表的时候,如果表不存在,SQL 语句可以顺利执行,但是会发出警告(warning)。

删除被其他表关联的主表

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

注意事项

  • 进行表或者字段删除操作时,要进行数据的完整备份。当有操作失误时,可以对数据进行恢复,以免造成无法挽回的后果,以为数据库的改变是无法撤销的。
  • 并不是每一个表都需要主键,一般的,多个表之间进行连接操作时需要用到主键。因此,并不需要为每个表建立主键,而且有些情况最好不使用主键。
  • 外键约束(FOREIGN KEY)不能跨引擎使用。如果表之间关联外键,却指定了不同的存储引擎,那么这些表之间是不能创建外键约束的。
  • 当使用 AUTO_INCREMENT 自增属性时,可以指定第一条插入记录的自增字段的值,这样新插入的记录的自增字段值从初始值开始递增。
  • MySQL

    MySQL 是一个关系型数据库管理系统,由瑞典 MySQL AB 公司开发,目前属于 Oracle 公司。MySQL 是最流行的关系型数据库管理系统之一。

    691 引用 • 535 回帖
  • 数据表基本操作
    1 引用
  • 主键
    3 引用 • 2 回帖
  • 外键
    2 引用 • 1 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...