MYSQL数据库表结构修改

1.表名的修改

语法如下:

ALTER TABLE 表名

RENAME TO 新表名

注意:修改表名还可以执行命令:RENAME TABLE 表名 TO 新表名;

例:将mybatis数据库中Register名改为bbs_Register。

代码如下:

ALTER TABLE Register

RENAME TO bbs_Register;
 

RENAME TABLE RegisterTO bbs_Register;

2.字段的修改

(1)增加字段

语法如下:

ALTER TABLE 表名

ADD [COLUMN] 字段名 数据类型 [列级约束] [FIRST|AFTER 字段名]

注意:ADD指向表中添加字段。

字段添加包括三部分:字段名、数据类型和约束,语法和字段定义相同。

字段定义可查看——MYSQL数据库表的创建(定义字段)

FIRST——将新字段添加到第一列。

AFTER——将新字段添加到指定字段之后。

例:在数据库mybatis的Register中添加自增字段RId,数据类型为整型,取值不重复,并添加到第一列。代码如下:

ALTER TABLE Register
ADD RId INT AUTO_INCREMENT UNIQUE FIRST;

(2)删除字段

语法如下:

ALTER TABLE 表名

DROP [COLUMN] 字段名 

例:删除在数据库mybatis的Register的字段RId。

代码如下:

ALTER TABLE Register
DROP RId ;

(3)修改字段名和数据类型

1)修改字段名和数据类型属于表结构的修改,语法如下   :

ALTER TABLE 表名

CHANGE [COLUMN] 原字段名 新字段名 新数据类型

注意:关键词CHANGE用于同时修改字段名和数据类型,也可以用来单独修改字段名或者单独修改数据类型。

2)只修改字段名时,字段类型不变,为原来的数据类型,语法如下:

 CHANGE [COLUMN] 原字段名 新字段名 原数据类型

3)只修改数据类型时,字段名不变,语法如下 :

 CHANGE [COLUMN] 原字段名 原字段名 新数据类型

4)修改字段的数据类型除了CHANGE 关键词可以实现,MODIFY关键字也可以实现,语法如下:

ALTER TABLE 表名

MODIFY [COLUMN] 字段名  新数据类型

注意:MODIFY 关键字仅对字段的数据类型进行修改。

(4)修改字段排列位置

1)表中各列位置是可以调整的,修改字段的排列位置属于表结构的修改,语法如下:

ALTER TABLE 表名

CHANGE [COLUMN] 字段名1 字段名1  数据类型 FIRST|AFTER 字段名2

注意:两个字段名1表示不修改原字段名。

FIRST——表示将字段名1对应的字段调整到第一列。

AFTER——字段名2表示将原字段名1对应的字段移动到字段名2对应字段之后。

2)修改字段的排列位置也可以用modify语法如下:

ALTER TABLE 表名

MODIFY [COLUMN] 字段名1   数据类型 FIRST|AFTER 字段名2

例:将mybatis数据库中user表的Score字段放在RDate字段之后。

代码如下:

ALTER TABLE user

CHANGE  Score Score  int AFTER RDate;

3.约束的修改

(1)删除约束

1)删除主码约束

语法如下:

ALTER TABLE 表名

DROP PRIMARY KEY;

例:删除mybatis数据库Register(注册表)中的主码约束。

代码如下:

ALTER TABLE Register

DROP PRIMARY KEY;

2)删除外码约束

(外码一旦删除,就会解除父表和子表间的父子关系)

语法如下:

ALTER TABLE 表名 DROP FOREIGN KEY 外码约束名;

例:删除mybatis数据库Register(注册表)中的两个外码约束。

代码如下:

ALTER TABLE Register
DROP FOREIGN KEY fk_CId;
ALTER TABLE Register
DROP FOREIGN KEY fk_SId;

3)删除唯一约束

语法如下:

ALTER TABLE 表名

DRO INDEX 唯一约束名;

例:删除mybatis数据库Department(系部表)中的唯一性约束。

代码如下:

ALTER TABLE Department
DROP INDEXD Name;

Department(系部表)中唯一性约束的名称是系统分配的,而删除唯一性约束需要指定约束名。

查看表中约束名方式:

1.使用MYSQL命令:

SHOW CREATE TABLEDepartment;

2.使用SQL语句:

SELECT constraint_name , constraint_type

FROM information_schema.table_constraints

WHERE table_schema='mybatis' AND table_Name ='Department';

4)删除默认值约束

语法如下:

ALTER TABLE 表名

CHANGE [COLUMN] 原字段名 原字段名  原数据类型 DEFAULT NULL;

或(使用modify语法

ALTER TABLE 表名

MODIFY [COLUMN] 字段名   数据类型 DEFAULT NULL;

例:删除mybatis数据库Course(课程表)中,CLimit(限选人数)字段的默认值约束。

代码如下:

ALTER TABLE Course
CHANGE CLimit CLimit  int DEFAULT NULL;

5)删除非空约束

语法如下:

ALTER TABLE 表名

CHANGE [COLUMN] 原字段名 原字段名  原数据类型 NULL;

ALTER TABLE 表名

MODIFY [COLUMN] 字段名   数据类型  NULL;

例:删除mybatis数据库Course(课程表)中,CName(课程名)字段的非空约束。

代码如下:

ALTER TABLE Course
CHANGE CName CName int NULL;

(2)增加约束

1)添加主键约束

语法如下:

ALTER TABLE 表名

ADD PRIMARY KEY(列名);

例:添加mybatis数据库Register(注册表)中的主码约束。

代码如下:

ALTER TABLE Register

ADD PRIMARY KEY(SId,CId);

2)添加外码约束

语法如下:

ALTER TABLE 表名 

ADD [CONSTRAINT 约束名] FOREIGN KEY (字段名) REFERENCES 父表 (主码字段名)

例:修改mybatis数据库Register(注册表),将字段SId设置为外码,与数据表Student的主键SId进行关联,同时字段CId设置为外码,与数据表Course的主键CId进行关联。

代码如下:

ALTER TABLE Register
ADD FOREIGN KEY (SId) REFERENCES Student (SId);
ALTER TABLE Register
ADD CONSTRAINT fk_CId FOREIGN KEY (CId) REFERENCES Course (CId);

3)添加唯一约束

语法如下:

ALTER TABLE 表名 

ADD [CONSTRAINT 约束名] UNIQUE(列名);

例:删除mybatis数据库Department(系部表),指定部门名唯一。

代码如下:

ALTER TABLE Department
ADD UNIQUE(DName);

4)添加默认值约束

语法如下:

ALTER TABLE 表名 

CHANGE [COLUMN] 原字段名 原字段名  原数据类型 DEFAULT 默认值;

或(使用modify语法

ALTER TABLE 表名

MODIFY [COLUMN] 字段名   数据类型 DEFAULT 默认值;

5)添加非空约束

语法如下:

ALTER TABLE 表名 

CHANGE [COLUMN] 原字段名 原字段名  原数据类型 NOT NULL;

或(使用modify语法

ALTER TABLE 表名

MODIFY [COLUMN] 字段名   数据类型  NOT NULL;

4.选项的修改

(1)修改存储引擎

语法如下:

ALTER TABLE 表名

ENGINE=新的存储引擎类型

(2)修改默认字符集

语法如下:

ALTER TABLE 表名

DEFAULT CHARSET=新的字符集

(3)修改索引关键字压缩方式

语法如下:

ALTER TABLE 表名

PACK_KEYS=新的压缩类型

(4)设置自增字段初始值

ALTER TABLE 表名

AUTO_INCREMFNT=新的初始值

<think>嗯,我现在要解决的问题是使用ALTER TABLE语句为course表的cname字段添加唯一约束,并且验证当插入重复的cname时系统会报错。让我仔细想一下应该怎么做。 首先,我需要回忆一下SQL中如何添加唯一约束。记得ALTER TABLE语句可以用来修改表结构,添加约束的话应该使用ADD CONSTRAINT子句,对吧?不过具体语法可能得查一下。唯一约束可以确保某列的值在表中是唯一的,所以当尝试插入重复值时,数据库应该拒绝并抛出错误。 然后,假设我已经有一个名为course的表,里面有一个cname字段。现在需要给这个字段加上唯一约束。可能的SQL语句是:ALTER TABLE course ADD UNIQUE (cname); 或者更明确地命名约束,比如ALTER TABLE course ADD CONSTRAINT constraint_name UNIQUE (cname); 这两种方式应该都可以,但最好指定约束名,方便以后管理。 接下来,添加完约束之后,我需要测试插入重复值的情况。比如,先插入一条cname为'Math'的记录,然后再插入一条同样cname为'Math'的记录。这时候第二条插入应该失败,并提示违反唯一约束的错误。具体的错误信息可能因数据库系统而异,比如在MySQL中可能是Duplicate entry 'Math' for key 'cname',而在PostgreSQL中可能是duplicate key value violates unique constraint "constraint_name"。 不过,我需要确保在添加约束之前,现有的cname字段的值已经是唯一的。如果有重复值存在,那么添加唯一约束会失败。这时候可能需要先清理数据或者处理重复项。但用户的问题中似乎已经成功添加了约束,所以假设当前表中没有重复的cname。 另外,关于ALTER TABLE语句的具体语法,可能需要确认数据库的支持情况。比如,不同的数据库管理系统(如MySQL、PostgreSQLSQL Server)可能有细微的差别,但基本结构应该是相似的。用户可能使用的是常见的如MySQL或PostgreSQL,所以应该用标准的SQL写法。 测试步骤的话,应该是: 1. 执行ALTER TABLE添加唯一约束。 2. 插入第一条记录,应该成功。 3. 插入第二条相同cname的记录,应该失败并报错。 可能的错误点包括:约束没有正确添加,或者测试时输入的数据有误。比如,字段类型是否匹配,或者是否有其他约束影响。比如,如果cname允许NULL,那么多个NULL值可能被允许,取决于数据库的设置。但用户的问题中没有提到NULL的情况,所以假设cname不允许NULL,或者数据库处理唯一约束时允许多个NULL。 另外,需要注意的是,唯一约束和主键的区别。主键也是唯一的,但一个表只能有一个主键,而唯一约束可以有多个,并且唯一约束的列允许NULL值(除非另外指定)。 总结一下,步骤应该是: 1. 使用ALTER TABLE添加唯一约束到cname字段。 2. 插入测试数据验证约束生效。 现在,我需要把这些步骤用清晰的中文解释出来,确保用户能够理解并正确执行。</think>### 分步说明:为 `course` 表的 `cname` 字段添加唯一约束 --- #### **步骤 1:确认表结构** 假设已存在 `course` 表,包含字段 `cname`(课程名称)。需确保当前表中 `cname` **无重复值**,否则添加约束会失败。 可通过以下 SQL 查询验证数据唯一性: ```sql SELECT cname, COUNT(*) FROM course GROUP BY cname HAVING COUNT(*) > 1; ``` 若存在重复值,需先清理数据。 --- #### **步骤 2:添加唯一约束** 使用 `ALTER TABLE` 语句为 `cname` 字段添加唯一约束: ```sql ALTER TABLE course ADD CONSTRAINT uq_course_cname UNIQUE (cname); ``` - `uq_course_cname` 是约束名称(可自定义),建议命名清晰以便后续管理。 - 执行成功后会阻止后续插入重复的 `cname`。 --- #### **步骤 3:测试唯一约束** **测试 1:插入唯一值** ```sql INSERT INTO course (cname) VALUES ('高等数学'); -- 正常执行,无报错 ``` **测试 2:插入重复值** ```sql INSERT INTO course (cname) VALUES ('高等数学'); ``` **预期结果**: 系统提示违反唯一约束错误,具体信息取决于数据库类型: - **MySQL**:`Duplicate entry '高等数学' for key 'uq_course_cname'` - **PostgreSQL**:`duplicate key value violates unique constraint "uq_course_cname"` - **SQL Server**:`Violation of UNIQUE KEY constraint 'uq_course_cname'` --- #### **关键注意事项** 1. **NULL 值的处理** - 唯一约束允许字段包含 `NULL` 值,但不同数据库对多个 `NULL` 的处理可能不同: - **MySQL**:允许多个 `NULL`。 - **SQL Server**:允许多个 `NULL`。 - **PostgreSQL**:将 `NULL` 视为唯一值,允许多个 `NULL`。 - 如需禁止 `NULL`,需额外添加 `NOT NULL` 约束: ```sql ALTER TABLE course ALTER COLUMN cname VARCHAR(255) NOT NULL; ``` 2. **复合唯一约束** 若需多个字段组合唯一(例如 `cname` + `teacher_id`),可使用: ```sql ALTER TABLE course ADD CONSTRAINT uq_course_name_teacher UNIQUE (cname, teacher_id); ``` --- #### **常见问题解决** - **错误:无法添加唯一约束(存在重复值)** 清理重复数据后再执行 `ALTER TABLE`: ```sql -- 示例:保留第一条重复数据,删除后续重复项 DELETE FROM course WHERE id NOT IN ( SELECT MIN(id) FROM course GROUP BY cname ); ``` - **删除唯一约束** ```sql ALTER TABLE course DROP CONSTRAINT uq_course_cname; -- PostgreSQL/SQL Server ALTER TABLE course DROP INDEX uq_course_cname; -- MySQL ``` --- 通过以上步骤,您已成功为 `cname` 字段添加唯一约束,确保课程名称的唯一性。插入重复值时,数据库会严格拦截并提示错误。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值