第3章_关系数据库标准语言(SQL)_004_数据表的创建和使用 _002_修改数据表
1. 修改“必要”约束(“必要约束” VS “非必要约束”) ===》
ALTER TABLE 表名 ALTER COLUMN 列名 列的数据类型(长度) [NULL(默认值) | NOT NULL]
译文: 修改(ALTER) ---> 表(TABLE) ---> 哪一张表(表名) ---> 修改(ALTER) ---> 列(COLUMN) ---> 哪一列(列名) ---> 修改为类型(列的数据类型(长度 (默认值为1)) [NULL(默认值) | NOT NULL]);
也就是说: 我们要将"数据类型" + "NULL | NOT NULL" = “必要约束” ===>
将字段数据类型和"NULL | NOT NULL"合在一起看成一种新的约束类型:“必要约束”,并且“数据类型 + "NULL"”为默认值。这也就意味着每一种数据类型对应着两种新的约束类型 ===》
1st. 字段数据类型 + NULL(可将NULL省略,因为它是默认值);
2nd. 字段数据类型 + NOT NULL;
将"NULL / NOT NULL"约束和数据类型绑定的依据 ===》
--(1). 在第4点的修改约束类型的时候"CONSTRAINT 约束名"后加上"NOT NULL",编译器的提示为: "NOT"附近有语法错误,应该为"CHECK"、"DEFAULT"、"PRIMARY"、"FOREIGN"、"REFERENCES"、"UNIQUE";
--(2). NOT NULL虽然不是必须紧跟在 列名 + 数据类型 后面,但是只有 列名 + 数据类型 出现后NOT NULL才能出现;
--(3). 在第3点的系统对象表中查询约束对象的时候,并没有查到有关于'NOT NULL'的约束对象,但是可以查到其他六大类约束的约束对象,有理由怀疑"NULL / NOT NULL"约束与其他的约束类型不同;
2. 新增一个字段名(顺便可以写上对该字段的约束) ===》
ALTER TABLE 表名 ADD 字段名 字段数据类型 [NULL(默认值) | NOT NULL] [{[CONSTRAINT 约束名] 约束类型 }]
译文: ALTER TABLE 表名 <列定义>
3. 修改字段的默认值(实质上是: 增加一个DEFAULT约束) ===》
ALTER TABLE 表名 ADD [CONSTRAINT 约束名] DEFAULT 默认值 FOR 字段名 [WITH VALUES]
译文: 修改(ALTER) ---> 表(TABLE) ---> 哪一张表(表名) ---> 为字段(字段名)设置(其实是: 新增(ADD))值为(默认值)的默认值(WITH VALUES的作用稍后再谈)
注释: 在英文中习惯将"为xx做yy"说成"做yy为了xx",比较强调"做了什么事"而不是"做这件事的目的"。
如果字段有默认值,则需要先删除字段的约束,在添加新的默认值 ===》
step_1: ALTER TABLE 表名 DROP CONSTRAINT 约束名;
step_2: ALTER TABLE 表名 ADD [CONSTRAINT 约束名] DEFAULT 新的默认值 FOR 字段名 [WITH VALUES];
step_1: 查询系统表sysobjects中的访问Add_field的约束对象的名称(从网上顺来的,现阶段不必掌握,但是也不远了,感兴趣的同学可以上W3SCHOOL ---> SQL自学):
select objs.name from sysconstraints cons
inner join syscolumns cols on cons.colid = cols.colid -- inner join: 内连接,将系统字段表在colid字段上进行内连接.
inner join sysobjects objs on cons.constid = objs.id -- 将系统对象表的constid字段与系统约束表的id字段进行内连接.
where cons.id = object_id('表名') and cols.name = '字段名' -- 当系统约束表的id字段上的值 = 表名,并且系统字段表的name字段上的值 = 字段名时返回视图.
或者更牛批的(网上顺来装逼的,别问我会不会,我不会!) ===》
declare @csname varchar(100)
set @csname= ''
select @csname=[name] from sysobjects
where id=(select cdefault from syscolumns where id=object_id('Test') and name='age')
exec('alter table [dbo].[Test] drop constraint ' + @csname )
exec('alter table [dbo].[Test] add constraint ' + @csname + ' Default((18)) for age')
step_2: 然后执行完这条命令之后,在消息框中会产生一张视图并把系统自动取的约束对象(假定为a)显示出来,这样我们就能复制该对象的名字;
step_3: ALTER TABLE 表名 DROP CONSTRAINT a;
step_4: ALTER TABLE 表名 ADD [CONSTRAINT 约束名] DEFAULT 新的默认值 FOR 字段名 [WITH VALUES];
现在来看WITH VALUES的作用,如下 ===》
WITH VALUES仅在ALTER的时候生效,并且会更新旧的数据。如果仅仅只有DEFAULT的话,只能保证新INSERT INTO的数据被赋值为默认值,不负责更新旧的数据。但是如果数据类型为NOT NULL时,则加不加WITH VALUES都是一样的,因为NOT NULL保证了数据不能为空,所以为了不冲突就只能取值DEFAULT了。
4. 修改约束类型(新增约束类型) ===》
ALTER TABLE 表名 ADD [CONSTRAINT 约束名] 约束类型 [{[CONSTRAINT 约束名] 约束类型 }]
译文: 修改(ALTER) ---> 表(TABLE) ---> 哪一张表(表名) ---> 新增一个约束
注意 ===》
1st. 约束必须是表约束,如果是列约束,则相当于新建一个列并写上约束;
2nd. 而且如果约束中约束的列有了依赖项,则必须先删除这个就的约束,然后才能建立新的约束;
补充: "约束类型的种类"。
总结 ===》
一. ALTER修改数据表有6中形式 ===》
1. 修改字段的必要约束(数据类型 + "NULL / NOT NULL"约束) ===>
ALTER TABLE 表名 ALTER COLUMN 字段名 “必要约束”;
2. 新增字段名: ALTER TABLE 表名 ADD 字段名 “必要约束” [{[CONSTRAINT 约束名] 约束类型 }];
3. 修改字段(或者表)的约束类型 ===》
step_1: 删除原有的字段的约束类型: ALTER TABLE 表名 DROP CONSTRAINT 约束名;
step_2: 新增目标字段的约束类型: ALTER TABLE 表名 ADD [CONSTRAINT 约束名] 约束类型 [{[CONSTRAINT 约束名] 约束类型 }];
4. 删除字段: ALTER TABLE 表名 DROP COLUMN 字段名;
注释: 在DROP后加上COLUMN表示是列,这是因为字段名可以和表名同名。
5. 删除表: DROP TABLE 表名;
二. 所以这里又可以概括为3大类 ===》
1. 删除操作 ===》
--(1). 删除约束: ALTER TABLE 表名 DROP CONSTRAINT 约束名;
--(2). 删除字段: ALTER TABLE 表名 DROP COLUMN 字段名;
--(3). 删除表: DROP TABLE 表名;
2. 新增操作 ===》
--(1). 新增字段: ALTER TABLE 表名 ADD 字段名 “必要约束” [{[CONSTRAINT 约束名] 约束类型 }];
--(2). 新增约束类型: ALTER TABLE 表名 ADD [CONSTRAINT 约束名] 约束类型 [{[CONSTRAINT 约束名] 约束类型 }];
3. 修改操作 ===》
--(1). 修改字段的必要约束(数据类型 + "NULL / NOT NULL"约束) ===>
ALTER TABLE 表名 ALTER COLUMN 字段 “必要约束”;
这就要涉及到"存储过程",在此不做详细解释,只是解释基本语法 ===》
使用:EXEC SP_RENAME '表名[.字段名]' '新的名字' ['COLUMN'],"[]"要么同时出现要么同时消失,当出现时表示重命名表中的某一字段,而当消失时表示重命名该表。
SP_RENAME存储过程的语法 ===》
SP_RENAME [@objname = ]'对象的旧名字' [@newname]'新名字' [, [@objtype = ]'目标对象的类型']
--注释: objtype一共有5种 ===》
--(1). COLUMN,要重命名的列;
--(2). DATABASE,用户定义的数据库,要重命名数据库时需用此选项;
--(3). INDEX,用户定义的索引;
--(4). OBJECT,在 sysobjects 中跟踪的类型的项目。例如,OBJECT 可用来重命名约束(CHECK、FOREIGN KEY、PRIMARY/UNIQUE KEY)、用户表、视图、存储过程、触发器和规则等对象;
--(5). USERDATATYPE 通过执行 sp_addtype 而添加的用户定义数据类型;
补充: 修改字段的数据类型约束类型有了,那怎样修改字段名和表名呢?
补充: 修改字段的数据类型约束类型有了,那怎样修改字段名和表名呢?


浙公网安备 33010602011771号