modify column功能介绍
关键字:
Alter table、modify、人大金仓、KingbaseES
概述
该系列语法用于修改列中的定义,其语法可以总结为下述所示:
--修改单列的语法
ALTER TABLE table_name
MODIFIY column_name action;
--修改多列的语法
ALTER TABLE table_name
MODIFIY (
column_name1 action,
column_name2 action,
...
);
具体说明如下:
table_name:指要进行更改的表的名称。
column_name: 指要更改其定义的列名。
action:修改列的具体执行动作,其中支持的修改包括。
- 支持列设置NULL/NOT NULL。
- 设置列的默认值。
- 修改列的约束条件。
- 修改列的排序规则。
- 支持同时对多列的修改。
2.Modify column使用介绍
Alter table table_name modify(ColId [datatype] [collate_clause] [default_clause] [constraint_clause]);
具体用法用例如下
2.1修改列类型
Modify子句中列名后加类型名可以实现列的类型修改。
CREATE TABLE users_table(
user_id INT generated by default as identity,
first_name VARCHAR(30),
last_name VARCHAR(30),
email VARCHAR(50),
primary key (user_id)
);
insert into users_table(first_name, last_name, email) VALUES('Tom', 'King', '134-564-7894');
insert into users_table(first_name, last_name, email) VALUES('Melia', 'Peter', '131-584-7894');
insert into users_table(first_name, last_name, email) VALUES('Kik', 'Bob', '134-564-7894');
-- 修改数据类型
ALTER TABLE users_table modify(first_name text, email text);
ALTER TABLE users_table modify(first_name VARCHAR(30));
\d+ users_table
2.2修改列排序规则
在列中指定collate子句可以用于指定字符串数据的排序规则,排序规则决定字符串的比较方式,包括字符对大小写的敏感性及特殊字符的顺序。
--修改列排序规则
ALTER TABLE users_table modify(first_name COLLATE "C");
ALTER TABLE users_table modify(last_name COLLATE "POSIX");
\d+ users_table
2.3修改列默认值
在modify子句中列名支持指定DEFAULT子句,用于指定列的默认值。当出入新的数据时,如果没有显式指定值的情况下,将使用默认值填充该列。具体的用法如下:
ALTER TABLE users_table modify(first_name DEFAULT 'Default_first_name',last_name DEFAULT 'Default_last_name');
insert into users_table(first_name, last_name, email) VALUES('Tip', 'Tylie', '129-564-9547');
--查看表结构
\d+ users_table
--插入数据验证有默认值的列是否生效
insert into users_table(email) VALUES('123-564-3541');
select * from users_table;
2.4修改列级约束
当前modify子句支持修改NOT NULL/NULL、CHECK约束、外键约束、主键约束、唯一约束。
CREATE TABLE test_modify_table(
modify_id number(5) primary key,
first_name varchar(20),
last_name varchar(30)
);
ALTER TABLE test_modify_table modify(first_name varchar(50) default 'Tom' constraint name_check unique, last_name varchar(20) default 'Ji' unique);
\d test_modify_table
drop table test_modify_table;
约束修改后的表结构信息:
注:modify语句支持级联修改,也可指定约束名。单列上支持多个Check约束。
- 修改check约束和not null约束
ALTER TABLE test_modify_table modify(modify_id default 0 check(modify_id > 5));
ALTER TABLE test_modify_table modify(modify_id default 0 check(modify_id > 5)), modify(first_name default 'Tat' constraint first_name_check not null);
ALTER TABLE test_modify_table modify(modify_id default 5 constraint modifyid_check check(modify_id > 5));
\d test_modify_table
--外键索引约束修改
CREATE TABLE reft1(f1 int PRIMARY KEY, f2 varchar(30));
CREATE TABLE reft2(f1 int PRIMARY KEY, f2 INTEGER);
CREATE TABLE reft3(f1 int PRIMARY KEY, f2 INTEGER);
ALTER TABLE reft2 modify(f2 default 1 REFERENCES reft1);
\d+ reft2
ALTER TABLE reft3 modify(f2 default 1 REFERENCES reft3);
\d+ reft3
--主键约束
ALTER TABLE reft2 modify(f2 default 2 primary key);-- 错误: 对表 "reft2" 指定多个主键是不允许的
CREATE TABLE test_modify_table_ttt1(a int, b varchar(30));
--在表中原不存在主键约束的情况下可以修改成功
ALTER TABLE test_modify_table_ttt1 modify(a default 2 primary key);
2.5modify语句组合
支持多条modify语句组合,并进行表中列的定义修改。
-- modify table cascade
CREATE TABLE modify_table_cascade(a INT, b VARCHAR(50), name TEXT, test_id INT);
ALTER TABLE modify_table_cascade modify(b COLLATE "C" default 'DefaultName'), modify (name COLLATE "C" default 'Bob');
\d+ modify_table_cascade
ALTER TABLE modify_table_cascade modify(b default 'DefaultName' unique), modify(name default 'Tom');