如何修改数据库主键

博客围绕数据库表主键修改问题展开,在不改变表结构的情况下,探讨修改表A主键的变通方法。介绍了SQL中设置级联更新和写触发器同步修改两种方式,还指出SQL支持级联更新和删除,而Oracle仅支持级联删除,级联更新需用触发器实现。

 以前写了一个系统,某张表A定义了一个主键比如字段名为Name,该字段又作为另外一张表B的外部关键字,以前系统中是不能修改表A的主键的,现在有一特殊的要求,在不变更以前数据库表结构的情况下需要能够修改表A的主键,请问有什么变通的实现方法?

在SQL中可以设置为级联更新,或自己写一个触发器来同步修改。

触发器方式:
create trigger trg_A
on A
for update,delete
as
begin
    if exists(select 1 from inserted)
        update B set Name=(select Name from inserted) where Name=(select Name from deleted)
    else
        delete B where Name=(select Name from deleted)
end
go

级联更新和级联删除方式:
ALTER TABLE [dbo].[T_USERGROUP] ADD
        CONSTRAINT [FK_T_USERGROUP_T_ACCTTEMPLATE] FOREIGN KEY
        (
                [ATNAME]
        ) REFERENCES [dbo].[T_ACCTTEMPLATE] (
                [ATNAME]
        )ON UPDATE CASCADE
 
 对于外部关键的可以采用此方法

补充: SQL数据库支持级联更新和级联删除,
           Oracle不支持级联更新(为了避免死锁的问题吧可能),支持级联删除,如果需要实现级联删除只能通过触发器方式来实现

不同数据库修改主键的方法有所不同,以下为常见数据库修改主键的方法: ### ORACLE 1. 查找主键id: ```sql select constraint_name from user_constraints where table_name='TABNAME'; ``` 2. 删除主键约束: ```sql alter table TABNAME drop constraint KEY_ID; ``` 其中,`KEY_ID`代表上面查到的主键id。 3. 重新添加主键: ```sql alter table TABNAME add primary key(another_col,...); ``` 括号中可填一个或多个其他列名 [^1]。 ### MYSQL 1. 删除原主键: ```sql alter table TABNAME drop primary key; ``` 2. 添加新主键: ```sql alter table TABNAME add primary key(another_col,...); ``` 不过,对于已有数据的表,如果新主键字段在所有数据中的值存在重复,设置该字段为主键时会报错,如提示`ERROR 1062 (23000): Duplicate entry ‘’ for key ‘PRIMARY’` [^1][^3]。 ### 达梦7数据库 以单表修改主键类型为例: 1. 新增临时索引: ```sql CREATE CLUSTER INDEX T_TEAM_DISPATCH_TASK_DDDXXX ON T_TEAM_DISPATCH_TASK(AQJCR); COMMIT; ``` 执行该命令后,`constraint`名称会发生变化。 2. 删除主键约束: ```sql ALTER TABLE T_TEAM_DISPATCH_TASK DROP constraint T_TEAM_DISPATCH_TASK_PK ; ``` 3. 修改主键类型: ```sql ALTER TABLE T_TEAM_DISPATCH_TASK MODIFY ( ID INT ) ; ``` 4. 删除临时索引: ```sql DROP INDEX T_TEAM_DISPATCH_TASK_DDDXXX ; ``` 5. 添加主键约束: ```sql ALTER TABLE T_TEAM_DISPATCH_TASK ADD CONSTRAINT T_TEAM_DISPATCH_TASK_PK PRIMARY KEY (ID); COMMIT; ``` [^2] ### SQL中创建和修改表时的主键操作 1. 命名`PRIMARY KEY`约束并定义多个列的`PRIMARY KEY`约束: ```sql CREATE TABLE Persons ( P_Id int NOT NULL, LastName varchar(255) NOT NULL, FirstName varchar(255), Address varchar(255), City varchar(255), CONSTRAINT pk_PersonID PRIMARY KEY (P_Id, LastName) ); ``` 2. 当表已经创建时,在"P_Id"列上创建`PRIMARY KEY`约束: ```sql ALTER TABLE Persons ADD PRIMARY KEY (P_Id); ``` [^4]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值