//添加唯一约束
ALTER TABLE table_name ADD unique(`name`);
关于int类型
`upload_id` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '已上传文件的id',
1、UNSIGNED 必须在 NOT NULL的前面
2、DEFAULT 必须为整型,不能是 '' or null
3、可以简写为 `upload_id` int(10) NOT NULL DEFAULT 0 COMMENT '已上传文件的id' //非严格模式,可以为空,为空时插入值为0
`upload_id` int(10) NOT NULL COMMENT '已上传文件的id' //严格模式,不可以为空,为空报错
`upload_id` int(10) COMMENT '已上传文件的id' //非严格模式,可以为空,不传值,默认为null
实例 1
实例 2
参考:Link
timestamp 默认值不能为‘0000-00-00 00:00:00’,由于官方文档是1907-01-01 00:00:01开始计算的美国时间,所以国内要+08.
并且timestamp的值插入的时候需要格式化 date("Y-m-d H:i:s");
CREATE TABLE IF NOT EXISTS `keylog`(
`id` int(10) UNSIGNED AUTO_INCREMENT,
`onlyauth` varchar(255) NOT NULL,
`keylog_at` timestamp NOT NULL DEFAULT '1970-01-01 08:00:01' COMMENT '击键时间',
`content` text COMMENT '上传的内容',
`uploaded_at` timestamp NOT NULL DEFAULT '1970-01-01 08:00:01' COMMENT '上传的时间',
`created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
PRIMARY KEY ( `id` )
)ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE t1 (
ts2 TIMESTAMP DEFAULT CURRENT_TIMESTAMP
ON UPDATE CURRENT_TIMESTAMP); //适用于自动更新updated_at,在创建和更新时都更新时间
CREATE TABLE t1 (
ts2 TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); //适用于自动创建created_at,只在创建时更新时间
CREATE TABLE t1 (
ts2 TIMESTAMP NOT NULL DEFAULT '1970-01-01 08:00:01'); //适用于默认时间戳,不能是'0000-00-00 00:00:00'
实例3
关于 ALTER TABLE:Link
参考:Link
mysql修改字段类型:
--能修改字段类型、类型长度、默认值、注释
--对某字段进行修改
ALTER TABLE 表名 MODIFY COLUMN 字段名 新数据类型 新类型长度 新默认值 新注释; -- COLUMN可以省略
alter table table1 modify column column1 decimal(10,1) DEFAULT NULL COMMENT '注释'; -- 正常,能修改字段类型、类型长度、默认值、注释
mysql修改字段名:
ALTER TABLE 表名 CHANGE 旧字段名 新字段名 新数据类型;
alter table table1 change column1 column1 varchar(100) DEFAULT 1.2 COMMENT '注释'; -- 正常,此时字段名称没有改变,能修改字段类型、类型长度、默认值、注释
alter table table1 change column1 column2 decimal(10,1) DEFAULT NULL COMMENT '注释' -- 正常,能修改字段名、字段类型、类型长度、默认值、注释
alter table table1 change column2 column1 decimal(10,1) DEFAULT NULL COMMENT '注释' -- 正常,能修改字段名、字段类型、类型长度、默认值、注释
alter table table1 change column1 column2; -- 报错
实例4
添加:
alter table logs add (
`created_at` timestamp DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updated_at` timestamp DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间'
)
删除:
如果报错就单独删除某个字段:
ALTER TABLE logs DROP COLUMN created_at,COLUMN updated_at;
修改:
change 更改字段名和字段类型, modify 更改字段类型但不能更改其字段名name, alter 仅用于更改列默认值 value。
alter table logs alter column `is_remind` set DEFAULT 0
参考范例example:
重命名,重新定义和重新排序列
CHANGE
,MODIFY
和ALTER
子句允许更改现有列的名称和定义。它们具有以下比较特征:
-
CHANGE
: -
可以重命名列并更改其定义,或两者。
-
具有比
MODIFY
更多的能力,但是以牺牲一些操作的便利性为代价。如果不重命名,CHANGE
需要将列命名两次。 -
使用
FIRST
或AFTER
,可以重新排序列。 -
MODIFY
: -
可以更改列定义但不能更改其 name。
-
比
CHANGE
更方便更改列定义而不重命名。 -
使用
FIRST
或AFTER
,可以重新排序列。 -
ALTER
:仅用于更改列默认值 value。
CHANGE
是标准 SQL 的 MySQL 扩展。 MODIFY
是 Oracle 兼容性的 MySQL 扩展。
要更改列以更改其 name 和定义,请使用CHANGE
,指定旧名称和新名称以及新定义。对于 example,要将INT NOT NULL
列从a
重命名为b
并将其定义更改为使用BIGINT
数据类型,同时保留NOT NULL
属性,请执行以下操作:
ALTER TABLE t1 CHANGE a b BIGINT NOT NULL;
要更改列定义但不更改其 name,请使用CHANGE
或MODIFY
。使用CHANGE
时,语法需要两个列名,因此必须指定两次相同的 name 以保持 name 不变。对于 example,要更改列b
的定义,请执行以下操作:
ALTER TABLE t1 CHANGE b b INT NOT NULL;
更改定义更方便MODIFY
而不更改 name,因为它只需要列 name 一次:
ALTER TABLE t1 MODIFY b INT NOT NULL;
要更改列 name 但不更改其定义,请使用CHANGE
。语法需要列定义,因此要保持定义不变,必须重新指定列当前具有的定义。对于 example,要将INT NOT NULL
列从b
重命名为a
,请执行以下操作:
ALTER TABLE t1 CHANGE b a INT NOT NULL;
对于使用CHANGE
或MODIFY
的列定义更改,定义必须包括应用于新列的数据类型和所有属性,而不是索引属性(如PRIMARY KEY
或UNIQUE
)。原始定义中存在但未为新定义指定的属性不会继续使用。假设列col1
被定义为INT UNSIGNED DEFAULT 1 COMMENT 'my column'
并且您按如下方式修改列,打算仅将INT
更改为BIGINT
:
ALTER TABLE t1 MODIFY col1 BIGINT;
该语句将数据类型从INT
更改为BIGINT
,但它也会删除UNSIGNED
,DEFAULT
和COMMENT
属性。为了保留它们,声明必须明确包含它们:
ALTER TABLE t1 MODIFY col1 BIGINT UNSIGNED DEFAULT 1 COMMENT 'my column';