ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

更新MySQL中的唯一键或主键

2019-07-09 06:15:04  阅读:1136  来源: 互联网

标签:mysql sql-update primary-key


我正在构建一个数据库管理工具供客户自己使用,而且我在处理更新主/唯一密钥的可能性时遇到了一些问题.因此,鉴于更新的数据是由每个行的PHP脚本传递的,这就是我提出的(从“immediatly”到“一段时间后”):

> DELETE / INSERT而不是UPDATE(糟糕,我现在……):

DELETE FROM table WHERE unique_key=x;
DELETE FROM table WHERE unique_key=y;
INSERT INTO table VALUES (unique_key=y, field=record1), (unique_key=x, field=record2);

>更改我的主键/唯一键,然后用修改后的值替换它们:

UPDATE table SET unique_key=x* WHERE unique_key=x;
UPDATE table SET unique_key=y* WHERE unique_key=y;
UPDATE table SET unique_key=y WHERE unique_key=x*;
UPDATE table SET unique_key=x WHERE unique_key=y*;

>向我的所有表中添加一个不可修改的auto_increment字段“id”,作为代理主键

就像现在一样,我正在为一切添加“id”字段.其他选择?

解决方法:

更新主键不是问题; SQL中(以及关系模型中)的所有值都应该是可更新的.

问题似乎是交换主键,其中

>如果你使用代理键(因为它们没有意义,所以没有必要更新)对我来说没有意义
>如果您使用自然键,对我来说没有意义,因为这就像将您的StackOverflow用户ID与您的用户交换一样.

在每个表中添加“ID”列对您没有帮助. “unique_key”列仍然必须声明为唯一.添加“ID”列不会更改该业务要求.

如果MySQL支持延迟约束,则可以交换主键值. (延迟约束是标准SQL中的一项功能.)但MySQL不支持该功能.例如,在PostgreSQL中,你可以这样做.

create table test (
  unique_key char(1) primary key deferrable initially immediate,
  other_column varchar(15) not null
);

insert into test values 
('x', 'record2'),
('y', 'record1');

begin;
set constraints test_pkey deferred;
update test set unique_key = 'y' where other_column = 'record2';
update test set unique_key = 'x' where other_column = 'record1';
commit;

select * from test;

unique_key  other_column
--
y           record2
x           record1

标签:mysql,sql-update,primary-key
来源: https://codeday.me/bug/20190709/1409963.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有