在 mysql 表中使用重复键验证插入值-ag捕鱼王app官网

当前位置:ag捕鱼王app官网 > > 数据库 > mysql >

在 mysql 表中使用重复键验证插入值

作者:迹忆客 最近更新:2024/03/26 浏览次数:

传统 sql 的 insert 语句不会针对现有数据库表执行其参数/值的输入验证。在插入过程中发现重复键时,有时会导致错误。

这在 mysql 中通过 insert 的扩展与 on duplicate key updatereplaceignore 等语句进行处理。

为了说明这些方法,让我们创建一个名为 programming_languages 的示例数据库。

-- here goes the definition of the database
createdatabaseprogramming_languages;useprogramming_languages;-- creating a table
createtabledetails(idintnotnullauto_increment,namevarchar(25)unique,-- making name column unique 
year_releasedvarchar(5),primarykey(id));

输出:

20:22:03	create database programming_languages	1 row(s) affected	0.219 sec
20:22:03	use programming_languages	0 row(s) affected	0.000 sec
20:22:03	create table details(id int not null auto_increment, name varchar(25) unique,     year_released varchar (5),primary key(id)) 0 row(s) affected	0.625 sec

现在,详细信息表将填充如下值。

-- names of popular programming languages and their release year
insertintodetails(name,year_released)values('python',1991),('c  ',1985),('java',1995);select*fromdetailsorderbyid;-- previewing table

输出:

id	name	year_released
1	python	1991
2	c  		1985
3	java	1995
-----------------------------------------------------------------------------------------
20:23:24	insert into details (name, year_released) values ('python', 1991),('c  ', 	     1985),('java',1995) 3 row(s) affected records: 3 duplicates: 0 warnings: 0	0.109 sec
20:23:24	select * from details order by id limit 0, 1000	3 row(s) returned 0.000 sec /     0.000 sec

我们尝试在表中插入一个名为 python 的行。正如预期的那样,此操作会导致错误。

-- trying to insert a new value
insertintodetails(name,year_released)values('python',1992)

输出:

20:27:31	insert into details (name, year_released) values ('python',1992) error code:     1062. duplicate entry 'python' for key 'details.name' 0.046 sec

使用 on duplicate key 更新方法在具有重复键验证的 mysql 表中插入值

此方法要么插入新值(如果表中不存在),要么更新现有行。因此,如果一行包含与新插入相同的数据,mysql 不会进行任何更改。但是,如果其数据与插入查询不同,它会更新该行。如果该行不存在,则插入该行。

insertintodetails(name,year_released)values('python',1992)asvonduplicatekeyupdatename=v.name,year_released=v.year_released;select*fromdetailsorderbyid;-- checking the output

输出:

id	name	year_released
1	python	1992
2	c  		1985
3	java	1995
-----------------------------------------------------------------------------------------
20:47:35	insert into details (name, year_released) values ('python', 1992) as v on         duplicate key update name = v.name, year_released = v.year_released 2 row(s) affected     0.172 sec
20:49:23	select * from details order by id limit 0, 1000	3 row(s) returned	0.000 sec     / 0.000 sec

从输出中观察到,year_released 列已针对 python 进行了更新,并且日志表明两 (2) 行受到影响(典型的行更新操作)。可以参考此扩展的官方参考以获取更多选项。


使用 replace 方法在具有重复键验证的 mysql 表中插入值

谨慎使用此方法!与之前的扩展不同,它删除行并插入包含所需数据的新行。虽然这可能看起来是良性的,但如果在操作期间删除了行的唯一关系,则可能会出现问题。

replaceintodetails(name,year_released)values('python',1993);select*fromdetailsorderbyid;

输出:

id	name	year_released
2	c  		1985
3	java	1995
7	python	1993
-----------------------------------------------------------------------------------------
20:56:48	replace into details (name, year_released) values ('python', 1993) 2 row(s)       affected 0.093 sec

现在,观察 insert 操作是否执行。但是,id 已更改(由于删除和插入)。建议查看此扩展的官方参考以确定安全使用和额外选项。


使用 ignore 方法在具有重复键验证的 mysql 表中插入值

ignore 方法对具有 duplicate keys 的行没有任何作用。但是,它不会为 insert 操作引发错误。此方法可以处理不允许更新并且不需要引发异常/错误的情况。

insertignoreintodetails(name,year_released)values('python',1991);select*fromdetailsorderbyid;

输出:

id	name	year_released
2	c  		1985
3	java	1995
7	python	1993
-----------------------------------------------------------------------------------------
21:29:44	insert ignore into details (name, year_released) values ('python', 1991) 0 	     row(s) affected, 1 warning(s): 1062 duplicate entry 'python' for key 'details.name'	0.157 sec

正如预期的那样,mysql 不会引发任何错误。但是,该表保持不变。

转载请发邮件至 1244347461@qq.com 进行申请,经作者同意之后,转载请以链接形式注明出处

本文地址:

相关文章

如何在 mysql 中声明和使用变量

发布时间:2024/03/26 浏览次数:115 分类:mysql

当你需要在 mysql 中的脚本中存储单个值时,最好的方法是使用变量。变量有不同的种类,有必要知道何时以及如何使用每种类型。

发布时间:2024/03/26 浏览次数:176 分类:mysql

本教程演示了如何在 mysql 中重置自动增量。

在 mysql 中实现刷新权限

发布时间:2024/03/26 浏览次数:211 分类:mysql

本教程介绍了 mysql 中的刷新权限命令,用于刷新授权表并影响允许的更改。

在 mysql 中设置时区

发布时间:2024/03/26 浏览次数:93 分类:mysql

在本教程中,我们将学习如何在 mysql 服务器中更改时区。

发布时间:2024/03/26 浏览次数:199 分类:mysql

本教程演示如何在 mysql 中转换为整数。

扫一扫阅读全部技术教程

社交账号
  • https://www.github.com/onmpw
  • qq:1244347461

最新推荐

教程更新

热门标签

扫码一下
查看教程更方便
网站地图