当前位置: 澳门新濠3559 > 编程 > 正文

创建表的命令,数据库逻辑删除解决方案

时间:2019-10-03 11:33来源:编程
你可能是一个程序员,在简书的搜索框上输入了“数据库逻辑删除解决方案”并点击了搜索按钮。 MySQL入门笔记(二) MySQL入门笔记(二) MySQL基础一 上一节主要了解了MySQL数据库的相

你可能是一个程序员,在简书的搜索框上输入了“数据库逻辑删除解决方案”并点击了搜索按钮。

MySQL入门笔记(二)

MySQL入门笔记(二)

  • MySQL基础一
    上一节主要了解了MySQL数据库的相关命令和数据库中存储的数据类型, 这一节主要是MySQL中对于表的操作。
    数据表(或称表): 是数据库的重要储存部分, 是一张二维表格由行和列组成,行称呼为记录,列称之为字段。

- 本文章有很多废话,如果不想看直接拉到底部 -

一、数据类型

一、数据类型

在创建表之前 需要打开数据库,使用USE db_name;命令打开数据库。这样就能在db_name下创建表了。

在进行数据库设计时,你的公司认为数据对于公司来说存在重大意义(即便是已经删除的数据),因此你被强制要求对于数据的删除只能使用逻辑删除,即增加一个标记字段来记录该数据的删除状态。

1. 整型

澳门新濠3559 1

1. 整型

澳门新濠3559 2

创建表的命令:

你遇到了这样一个场景,你的某个字段需要添加唯一键约束,因此你可能想了个办法,用业务来控制唯一键。例如你的数据表中name是唯一的,现在你需要插入一条name = a的记录:

2. 浮点型

澳门新濠3559 3

2. 浮点型

澳门新濠3559 4

CREATE TABLE [IF NOT EXISTS] t_name(
column_name data_type,
...
);

澳门新濠3559 5

3. 字符型

澳门新濠3559 6

3. 字符型

澳门新濠3559 7

查看当前打开的数据库 SELECT DATABASE();

然而你的服务运行了一段时间后你还是发现了数据库中存在 name = a 且 is_delete = 0 的多条字段,大部分是由于以下原因:

4. 日期时间型

澳门新濠3559 8

4. 日期时间型

澳门新濠3559 9

我们先创建一张工资表,用来练手:

澳门新濠3559 10

二、数据库操作

二、数据库操作

CREATE TABLE t_salary(
username VARCHAR(20),
age TINYINT UNSIGNED,
salary FLOAT(8,2) UNSIGNED
);

你发现在业务层面这个问题似乎是无法避免的,于是你开始考虑从数据库层面避免该问题。你决定在name字段添加唯一键约束,但很快就否定了这个想法,因为这样根本没法进行删除,所以你开始在网上寻找解决办法。

1. 创建库

CREATE {DATABASE | SCHEMA} [IF NOT EXISTS] db_name [DEFAULT] CHARACTER SET [=] charset_name;

  上述代码中DATABASE和SCHEMA完全相同,可任选一个(花括号内的参数为任选其一);

  添加IF NOT EXISTS的作用则是,若新建数据库的名称与已有数据库名称冲突,则产生一个警告,若无该关键字,则会产生错误(中括号内的参数为可省略参数);

  db_name为数据库名称;

  [DEFAULT] CHARACTER SET [=] 为指定数据库的字符编码,可不指定而使用默认的字符编码。

  例1:创建一个名为test的数据库

CREATE DATABASE test;

  例2:创建一个名为test2的数据库并指定字符编码为GBK

CREATE DATABASE test2 CHARACTER SET gbk;

  有一点需要注意的是,这一步骤仅仅是创建了数据库,在后面需要创建数据表时,需要打开指定数据库:

USE db_name;

1. 创建库

CREATE {DATABASE | SCHEMA} [IF NOT EXISTS] db_name [DEFAULT] CHARACTER SET [=] charset_name;

  上述代码中DATABASE和SCHEMA完全相同,可任选一个(花括号内的参数为任选其一);

  添加IF NOT EXISTS的作用则是,若新建数据库的名称与已有数据库名称冲突,则产生一个警告,若无该关键字,则会产生错误(中括号内的参数为可省略参数);

  db_name为数据库名称;

  [DEFAULT] CHARACTER SET [=] 为指定数据库的字符编码,可不指定而使用默认的字符编码。

  例1:创建一个名为test的数据库

CREATE DATABASE test;

  例2:创建一个名为test2的数据库并指定字符编码为GBK

CREATE DATABASE test2 CHARACTER SET gbk;

  有一点需要注意的是,这一步骤仅仅是创建了数据库,在后面需要创建数据表时,需要打开指定数据库:

USE db_name;

解释一下上面的意思 CREATE TABLE 命令为创建表格, UNSIGNED为无符号位,即正数。FLOAT(8,2)表示8位数保留小数点后2位。

百度、谷歌帮帮我。

2. 删除库

DROP {DATABASE | SCHEMA} [IF EXISTS] db_name;

  参数与创建数据库基本一致。

2. 删除库

DROP {DATABASE | SCHEMA} [IF EXISTS] db_name;

  参数与创建数据库基本一致。

ps: 今天听后台说起,如果是涉及到钱的话 可以设置类型为int 然后单位为分。具体的咱也没有学习到就先不谈了~

在网上搜寻很久以后,我看到了简书上一篇比较好的文章:逻辑删除真的不是一个好的设计。该文章提供了三个方法: 1.放弃mysql 2.添加delete_token字段 3.使用数据仓库,评论区机智网友还提出了方法2的改进: 方法2.5。

3. 修改库

ALTER {DATABASE | SCHEMA} [db_name] [DEFAULT] CHARACTER SET [=] charset_name;

  可修改的仅为字符编码方式。若不指定数据库名称,则修改当前选中的数据库。例:将名为test的数据库的字符编码方式改为utf-8

ALTER DATABASE test CHARACTER SET utf8;

3. 修改库

ALTER {DATABASE | SCHEMA} [db_name] [DEFAULT] CHARACTER SET [=] charset_name;

  可修改的仅为字符编码方式。若不指定数据库名称,则修改当前选中的数据库。例:将名为test的数据库的字符编码方式改为utf-8

ALTER DATABASE test CHARACTER SET utf8;

那么既然创建好了数据表, 如何查看数据表呢?

方法2,即为数据库添加新的一列delete_token,当某一条记录需要删除时,将该字段设置为一个UUID,将name、delete_token设置为唯一键,这样当is_delete=0时,delete_token保持一个默认值,能够有效地限制name唯一,当记录被删除时,由于delete_token是一个唯一的UUID,便能保证删除的记录不会被唯一约束束缚。但正如该文章的博主所说,UUID会占用很大的空间,所以不推荐使用。评论网友针对该问题提出优化对策:方法2.5:将删除记录的delete_token设置为该记录的id。

4. 查看库

4. 查看库

查看数据表命令
SHOW TABLES [FROM db_name] [LIKE 'pattern' | WHERE expr]
查看数据表的命令是否影响当前使用的数据库呢,可以使用
SELECT DATABASE();查看当前使用的数据库。

个人认为,索引太大只是其中一个弊端,该方法还会面临一个很棘手的问题:当需要批量删除时,需要对每一条记录进行逐行删除。例如该表还有一个字段叫age,现在需要删除age > 18的记录,共有50条,在业务中,由于需要为每条的delete_token字段插入一个UUID所以需要将其拆分为50条更新操作来进行。这样的代价显然很难接受

4.1 查看当前所有库

SHOW DATABASES;

4.1 查看当前所有库

SHOW DATABASES;

表有了 怎么查看数据表中的各个字段呢,也就是表结构如何查看。
查看数据表结构:
SHOW COLUMNS FROM table_name;

每种办法都有一定的应用场景,既然强制要求使用逻辑删除,就会面临很多问题,在所难免。今天刚好突然想到一个不错的点子能解决逻辑删除带来的问题,若该方法已经被提出,纯属巧合。

4.2 查看指定数据库的创建信息

SHOW CREATE DATABASE db_name;

4.2 查看指定数据库的创建信息

SHOW CREATE DATABASE db_name;

澳门新濠3559 11

将删除标记设置默认值,将唯一字段与删除标记添加唯一键约束。当某一记录需要删除时,将删除标记置为NULL。

4.3 查看当前打开的数据库

SELECT DATABASE();

4.3 查看当前打开的数据库

SELECT DATABASE();

工资表结构

由于NULL不会和其他字段有组合唯一键的效果,所以当记录被删除时(删除标记被置为NULL时),解除了唯一键的约束。此外该方法能很好地解决批量删除的问题(只要置为NULL就完事了),消耗的空间也并不多(1位

三、数据表操作

三、数据表操作

好了,既然表已经有了接下来就该如何存储数据了, 在mysql中可以使用insert 插入一条数据(记录)。
插入命令:
INSERT [INTO] table_name [(column1, column2...)] VALUES(value1, value2, ...)
从命令中可以看出 字段可以省略,那如果字段省略之后, 值一定要跟表中的数据一一对应,否则会发生错误。
插入数据(记录)之后,可以使用SELECT命令进行查找数据。SELECT 命令在数据库的使用中 非常普遍。
简单查找命令
SELECT expr,... FROM table_name;

  • 联合索引)。

1. 创建表(各种约束)

1. 创建表(各种约束)

表约束

目前还没发现这个办法有什么奇怪的bug。如果有请不要吝啬在评论区留言讨论。

1.1 定义

CREATE TABLE [IF NOT EXISTS] table_name(
    column_name data_type [constraint],
    ···
);

  constraint为约束,可选参数。(详情见1.2 约束)例:创建一个名称为t1,包含id、username以及age三个字段的数据表

CREATE TABLE t1(
    id SMALLINT UNSIGNED,
    username VARCHAR(20),
    age TINYINT UNSIGNED
);

1.1 定义

CREATE TABLE [IF NOT EXISTS] table_name(
    column_name data_type [constraint],
    ···
);

  constraint为约束,可选参数。(详情见1.2 约束)例:创建一个名称为t1,包含id、username以及age三个字段的数据表

CREATE TABLE t1(
    id SMALLINT UNSIGNED,
    username VARCHAR(20),
    age TINYINT UNSIGNED
);
空值与非空值
  • NULL, 字段值可以为空
  • NOT NULL, 字段值禁止为空
    该约束不能同时出现在同一字段中, 字段默认为NULL 我们可以使用一个小例子来进行测试
  1. 创建t_null表
CREATE TABLE IF NOT EXISTS t_null(
username VARCHAR(20) NOT NULL,
age TINYINT UNSIGNED NULL
);
  1. 插入正常数据
INSERT t_null VALUES('Tom', NULL);

澳门新濠3559 12

正常

  1. 插入非法数据
INSERT t_null VALUES(NULL, 12);

澳门新濠3559 13

错误

1.2 约束

  约束,顾名思义,即对某些列或整个表产生约束、限制,增加输入规则,例如某些列不允许为空、某些列不允许重复等。按照功能划分,有以下几种:

1.2 约束

  约束,顾名思义,即对某些列或整个表产生约束、限制,增加输入规则,例如某些列不允许为空、某些列不允许重复等。按照功能划分,有以下几种:

自增约束

AUTOINCREMENT

  • 自动编号, 并且必须与主键组合使用
  • 默认情况下 起始为1, 每次的增量为1

(1)主键约束

PRIMARY KEY

  主键约束用于唯一地标识表中的每一条记录,通俗地说,就是加了主键约束的列或者表,不允许存在重复的记录。==添加了主键约束的列自动为NOT NULL。==

  例:某表中存在一列用于存储用户名,用主键约束限制其不能存在重复的用户名

username VARCHAR(20) PRIMARY KEY

  ==自动编号:==

AUTO_INCREMENT

  顾名思义,即自动编号,序号从1开始。需要注意,AUTO_INCREMENT必须与主键约束配套使用。

  例:

id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT

(1)主键约束

PRIMARY KEY

  主键约束用于唯一地标识表中的每一条记录,通俗地说,就是加了主键约束的列或者表,不允许存在重复的记录。==添加了主键约束的列自动为NOT NULL。==

  例:某表中存在一列用于存储用户名,用主键约束限制其不能存在重复的用户名

username VARCHAR(20) PRIMARY KEY

  ==自动编号:==

AUTO_INCREMENT

  顾名思义,即自动编号,序号从1开始。需要注意,AUTO_INCREMENT必须与主键约束配套使用。

  例:

id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT
主键

PRIMARY KEY

  • 每张表只能存一个主键
  • 主键保证记录的唯一性
  • 主键自动为NOT NULL
  • 自增约束必须组合主键使用, 但是主键不一定要组合自增使用

可以使用例子证明:

  1. 创建表格 (主键自增)
CREATE TABLE IF NOT EXISTS t_primary(
t_id SMALLINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(20) NOT NULL
);
  1. 插入数据
INSERT t_primary (username) VALUES('c');
INSERT t_primary (username) VALUES('oc');

澳门新濠3559 14

返回结果

  1. 查看数据
SELECT * FROM t_primary;

澳门新濠3559 15

查询所有字段结果

ps: 这里的*号为过滤的字段 如果为* 则表示显示全部的字段

显示10的那里是因为我为主键t_id赋值为10, 因为是自增所以下面为11 , 12, 13..

(2)唯一约束

UNIQUE KEY

  唯一约束与主键约束作用相同,也用于标识记录的唯一性,不同之处在于,同一个数据表中可存在多个唯一约束,但主键约束只能存在一个。此外,主键约束不允许为空,唯一约束则允许存在唯一的NULL值。

(2)唯一约束

UNIQUE KEY

  唯一约束与主键约束作用相同,也用于标识记录的唯一性,不同之处在于,同一个数据表中可存在多个唯一约束,但主键约束只能存在一个。此外,主键约束不允许为空,唯一约束则允许存在唯一的NULL值。

唯一约束

UNQUE KEY

  • 唯一约束
  • 唯一约束可以保证记录的唯一性
  • 唯一约束的字段可以为空值(NULL)
  • 每张数据表可以存在多个唯一约束

还是以一个例子来解释:

  1. 创建表格
CREATE TABLE IF NOT EXISTS t_unique(
t_id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(20) NOT NULL,
age TINYINT UNSIGNED UNQUE KEY
);
  1. 插入数据
INSERT t_unique (username, age) VALUES('tom', 20);
INSERT t_unique (username, age) VALUES('tom', 20);
  1. 错误

澳门新濠3559 16

重复错误

创建表的命令,数据库逻辑删除解决方案。(3)非空约束

NOT NULL

  非空约束的用于禁止用户在非空约束的列中输入NULL。

(3)非空约束

NOT NULL

  非空约束的用于禁止用户在非空约束的列中输入NULL。

默认约束

DEFAULT

  • 当插入记录时,如果没有明确赋值,则自动赋予默认值
    例子:
  1. 创建表格
CREATE TABLE IF NOT EXISTS t_default(
t_id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCRMENT,
username VARCHAR(20) NOT NULL,
sex ENUM('1', '2', '3') DEFAULT '3'
);
  1. 插入数据
INSERT t_default (username) values ('tom');
  1. 查看表中数据
SELECT * FROM t_default;
  1. 数据返回结果

澳门新濠3559 17

数据返回结果

(4)默认约束

DEFAULT value

  用于设置字段的默认值,当用户未输入当前字段时,将自动填入默认值。

  例:定义一个sex字段,默认情况下为3

sex ENUM('1', '2', '3') DEFAULT 3

(4)默认约束

DEFAULT value

  用于设置字段的默认值,当用户未输入当前字段时,将自动填入默认值。

  例:定义一个sex字段,默认情况下为3

sex ENUM('1', '2', '3') DEFAULT 3
外键约束
  • 父表和字表必须使用相同的存储引擎,而且禁止使用临时表
  • 数据表的存储引擎只能是INNODB
  • 外键列和参照列必须具有相同的数据类型,其中数字类型的长度或者是否有符号位必须相同,而字符的长度则不同.
  • 外键列和参照列必须创建索引,如果外键列不存在索引的话,MySQL将自动创建.
    关于最后一条, 如果参照列没有所以MySQL不会创建外键列的索引
    例子:
  1. 创建城市表
CREATE TABLE IF NOT EXISTS t_province(
id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
p_name VARCAHR(20) NOT NULL
);
  1. 创建用户表
CREATE TABLE IF NOT EXISTS t_users(
id SMALLINT UNSIGNED PRIMARY KEY AUT_INCREMENT,
username VARCHAR(20) NOT NULL,
p_id SMALLINT UNSIGN,
FOREIGN KEY (p_id) REFERENCES t_province (id)
);

如外键开头所说 如果参照列创建了索引,那么 MySQL会自动为外键列创建索引。虽然我们没有明显的为t_province表的id创建索引,但是id为主键, 主键会默认创建索引。所以t_users表中的p_id字段也会有索引。那么如何证明呢。 可以使用SHOW INDEXES FROM table_name命令查看表中的索引, 当然为了好看还可以使用 G 让索引成网格状显示。
查看t_province表中的索引

SHOW INDEXES FROM t_provinceG;

澳门新濠3559 18

t_province中的索引

查看t_users表中的索引

SHOW INDEXES FROM t_usersG;

澳门新濠3559 19

t_users中的索引

(5)外键约束

FOREIGN KEY(column_name1) REFERENCES table_name(column_name2)

  外键约束一般用于两个存在某种关系的字段,实现一对一或一对多的关系。

  例1:创建一个父表location和一个子表users,通过外键约束关联location中的id与users中的lid

CREATE TABLE location(
    id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(20) NOT NULL
);

CREATE TABLE users(
    id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
    username VARCHAR(20) NOT NULL,
    lid SMALLINT UNSIGNED,
    FOREIGN KEY(lid) REFERENCES location(id)
);

  使用外键约束需要注意一些问题,第一,父表和子表禁止使用临时表;第二,父表和子表必须使用相同的存储引擎,且必须为InnoDB;第三,外键列与参照列必须具有相似的数据类型,其中若为==数字==(INT、FLOAT等),则其==类型长度和是否有符号位都必须完全相同==,若为==字符==,则可为==不同长度==;第四,向子表插入记录时,需保证父表不为空。

外键约束的参照操作:

  指定当删除或更新父表中的记录时,对子表进行的操作。使用方式为在外键约束末尾加上ON DELETE,然后加上相应操作的关键字。操作分别有以下几种:

  1)CASCADE:当删除或更新父表中的记录时,自动更新或删除子表中相应的记录。

  2)SET NULL:当删除或更新父表中的记录时,将子表中相应的记录的外键列设置为NULL。==注意,需保证改外键列没有指定为NOT NULL。==

  3)RESTRICT:当父表中的记录被子表中的记录所参照时,这些被参照的记录不允许进行删除或更新操作,而未被参照的记录则可自由删除或更新。

  例:

  父表:

id(参照列) name
1 A
2 B
3 C

  子表:

name aid(外键列)
a 1
b 1
c 2

  在上面这种情况中,若子表的外键约束加了RESTRICT关键字,则由于父表中id为1和2的两条记录被参照,不能被删除或更新;而id为3的记录未被参照,因此可以删除或更新。

  4)NO ACTION:标准SQL中的关键字,在MySQL中等同于RESTRICT。

(5)外键约束

FOREIGN KEY(column_name1) REFERENCES table_name(column_name2)

  外键约束一般用于两个存在某种关系的字段,实现一对一或一对多的关系。

  例1:创建一个父表location和一个子表users,通过外键约束关联location中的id与users中的lid

CREATE TABLE location(
    id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(20) NOT NULL
);

CREATE TABLE users(
    id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
    username VARCHAR(20) NOT NULL,
    lid SMALLINT UNSIGNED,
    FOREIGN KEY(lid) REFERENCES location(id)
);

  使用外键约束需要注意一些问题,第一,父表和子表禁止使用临时表;第二,父表和子表必须使用相同的存储引擎,且必须为InnoDB;第三,外键列与参照列必须具有相似的数据类型,其中若为==数字==(INT、FLOAT等),则其==类型长度和是否有符号位都必须完全相同==,若为==字符==,则可为==不同长度==;第四,向子表插入记录时,需保证父表不为空。

外键约束的参照操作:

  指定当删除或更新父表中的记录时,对子表进行的操作。使用方式为在外键约束末尾加上ON DELETE,然后加上相应操作的关键字。操作分别有以下几种:

  1)CASCADE:当删除或更新父表中的记录时,自动更新或删除子表中相应的记录。

  2)SET NULL:当删除或更新父表中的记录时,将子表中相应的记录的外键列设置为NULL。==注意,需保证改外键列没有指定为NOT NULL。==

  3)RESTRICT:当父表中的记录被子表中的记录所参照时,这些被参照的记录不允许进行删除或更新操作,而未被参照的记录则可自由删除或更新。

  例:

  父表:

id(参照列) name
1 A
2 B
3 C

  子表:

name aid(外键列)
a 1
b 1
c 2

  在上面这种情况中,若子表的外键约束加了RESTRICT关键字,则由于父表中id为1和2的两条记录被参照,不能被删除或更新;而id为3的记录未被参照,因此可以删除或更新。

  4)NO ACTION:标准SQL中的关键字,在MySQL中等同于RESTRICT。

外键约束的参照操作
  • CASCADE: 从父表删除或者更新 时自动删除或者更新子表中匹配的行
  • SET NULL: 从父表删除或者更新行,并设置字表中的外键列为NULL。如果使用该选项, 必须保证字表列没有指定为NOT NULL
  • RESTRICT: 拒绝对父表的删除或更新操作
  • NO ACTION : 标准的SQL 的关键字, 在MySQL中与RESTRICFT相同

以上参照操作都是指 在创建好外键列的时候, 在更新表的时候, 字表是否也进行相应的操作
例子:

  1. 创建车库表
CREATE TABLE IF NOT EXISTS t_garage(
id SMALLINT UNSIGNED PRIMARY KEY AUTO_CREMENT,
garage_name VARCHAR(20) NOT NULL
);
  1. 创建车表
CREATE TABLE IF NOT EXISTS t_cars(
id SMALLINT UNSINGED PRIMARY KEY AUTO_CREMENT,
car_name VARCHAR(20) NOT NULL,
garage_id SMALLINT UNSIGNED,
FOREIGN KEY (garage_id) REFERENCES t_garage (id) ON DELETE CASCADE
);

因为车库表为父表,车表为字表 所以现在要父表中插入数据,再在子表中插入数据.

  1. t_garage插入数据
INSERT t_garage (garage_name) VALUES('A');
INSERT t_garage (garage_name) VALUES('B');
INSERT t_garage (garage_name) VALUES('C');

使用SELECT * FROM t_garage;查看表中数据

澳门新濠3559 20

t_garage表中数据

  1. t_cars插入数据
INSERT t_cars (car_name, garage_id) VALUES ('红旗', 3);
INSERT t_cars (car_name, garage_id) VALUES ('models', 1);
INSERT t_cars (car_name, garage_id) VALUES ('吉利', 3);

使用SELECT * FROM t_cars;查看表中数据

澳门新濠3559 21

t_cars中数据

  1. 删除父表中的记录
DELETE FROM t_garage where id = 3;

查看t_garage表中的数据 SELECT * FROM t_garage;

澳门新濠3559 22

t_garage中的数据

查看t_cars表中的数据SELECT * FROM t_cars;

澳门新濠3559 23

t_cars中的数据

由此可以看出 只要是父表中删除了数据,字表中的记录也会被删除。
由于在实际项目中不常使用参照操作,所以也不过多进行了~

2. 删除表

DROP TABLE tbl_name;

2. 删除表

DROP TABLE tbl_name;
表级约束与列级约束
  • 对于一个数据列建立的约束,称之为列级约束
  • 对多个数据列建立的约束, 称之为表级约束
  • 列级约束可以在列定义时声明,也可以在列定义后声明
  • 表级约束只能在列定义后声明

3. 更改表名称

3. 更改表名称

修改数据表
  • 添加单列
ALTER TABLE table_name ADD [COLUMN] column_name column_definition [FIRST | AFTER column_name]
  • 添加多列
ALTER TABLE table_name ADD [COLUMN] (column_name, column_definition, ...)

添加多列的时候不能指定位置关系, 只能在字段的后方。

  • 删除列
ALTER TABLE table_name DROP [COLUMN] column_name
  • 删除多列
ALTER TABLE t_name DROP [COLUMN] c_name, DROP c_name

用一个例子演示一下:

  1. 创建表格
CREATE TABLE IF NOT EXISTS t_action(
id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(20) NOT NULL
);
  1. 添加salary字段
ALTER TABLE t_action ADD salary FLOAT(8,2) UNSIGNED;
  1. 查看表结构
SHOW CLOUMNS FROM t_action;

澳门新濠3559 24

表结构

  1. 添加age字段
ALTER TABLE t_action ADD age SMALLINT UNSIGNED AFTER username;
  1. 查看表结构
SHOW COLUMNS FROM t_action;

澳门新濠3559 25

表结构

可以看到使用AFTER把age字段添加到了username字段的后方.

  1. 删除salary字段
ALTER TABLE t_action DROP salary;
  1. 查看表结构
SHOW COLUMNS FROM t_action;

澳门新濠3559 26

表结构

  1. 删除username 添加 area_name
ALTER TABLE t_action DROP username, ADD area_name VARCHAR(20) NOT NULL;
  1. 查看表结构
SHOW COLUMNS FROM t_action;

澳门新濠3559 27

表结构

由此可见如果想进行多个字段的添加和删除只需要用,隔开即可。

  • 添加主键
ALTER TABLE tbl_name ADD [CONSTRAINT[symbol]] PRIMARY KEY [index_type] (index_col_name, ...)

用一个例子说明:

  1. 创建一个t_user_test
CREATE TABLE IF NOT EXISTS t_user_test(
id SMALLINT UNSIGNED,
username VARCHAR(20) NOT NULL
);
  1. id添加主键约束
ALTER TABLE t_user_test ADD CONSTRAINT PK_user_test PRIMARY KEY (id);

CONSTRAINT 为设置别名,目前还不知道

  • 添加唯一约束
ALTER TABLE tbl_name ADD [CONSTRAINT [symbol]] UNIQUE KEY [INDEX|KEY] [index_name] [index_type] (index_col_name);
  • 添加外键约束
ALTER TABLE tb_name ADD [CONSTRINT [symbol]] FOREIGN KEY [index_name] (index_col_name, ...) reference_definition
  • 添加/删除默认约束
ALTER TABLE tbl_name ALTER [COLUMN] col_name {SET DEFAULT literal| DROP DEFAULET}
  • 删除主键约束
ALTER TABLE tbl_name DROP PRIMARY KEY;
  • 删除唯一约束
ALTER TABLE tbl_name DROP {INDEX | KEY} index_name;
  • 删除外键约束
ALTER TABLE tbl_name  DROP FOREIGN KEY fk_symbol;
  • 修改列定义
ALTER TABLE tbl_name MODIFY [COLUMN] col_name column_definition [FIRST|AFTER col_name]

修改列定义需要注意的是 如果修改的数据类型是由大往小了更改 那么会造成部分数据丢失。

  • 修改列名称
ALTER TABLE tbl_name CHANGE [COLUMN] old_col_name new_col_name column_definition [FIRST|AFTER col_name]
  • 数据表更名
    方法一
ALTER TABLE tbl_name RENAME [TO|AS] new_tbl_name

方法二

RENAME TABLE tbl_name TO new_tbl_name [, tbl_name2 TO new_tbl_name2] ...

方法二可以更换多个表的名称

3.1 更改单个数据表名称

ALTER TABLE tbl_name RENAME [TO | AS] new_tbl_name;

3.1 更改单个数据表名称

ALTER TABLE tbl_name RENAME [TO | AS] new_tbl_name;

插入 insert

3.2 更改多个数据表名称

RENAME TABLE tbl_name TO new_tbl_name [, tbl_name2 TO new_tbl_name2] ……

3.2 更改多个数据表名称

RENAME TABLE tbl_name TO new_tbl_name [, tbl_name2 TO new_tbl_name2] ……
第一种方法
INSERT [INTO] tbl_name [(col_name1, ...)] {VALUES|VALUE} ({expr | DEFAULT}, ...), (...),...

举个

编辑:编程 本文来源:创建表的命令,数据库逻辑删除解决方案

关键词: 澳门新濠3559