EXISTS 条件句防止插入重复记录

exists 条件句防止插入重复记录
exists 和 not exists 引入的子查询可用于两种集合原理的操作:交集与差集。两个集合的交集包含同时属于两个原集合的所有元素。

差集包含只属于两个集合中的第一个集合的元素

mysql教程> create table books(
    ->    bookid smallint not null primary key,
    ->    booktitle varchar(60) not null,
    ->    copyright year not null
    -> )
    -> engine=innodb;
query ok, 0 rows affected (0.05 sec)

mysql>
mysql>
mysql> insert into books values (12786, 'java',           1934),
    ->                          (13331, 'mysql',          1919),
    ->                          (14356, 'php教程',            1966),
    ->                          (15729, 'perl',           1932),
    ->                          (16284, 'oracle',         1996),
    ->                          (17695, 'pl/sql',         1980),
    ->                          (19264, '网页特效',     1992),
    ->                          (19354, 'www.java2s.com', 1993);
query ok, 8 rows affected (0.03 sec)
records: 8  duplicates: 0  warnings: 0

mysql>
mysql>
mysql> create table authors(
    ->    authid smallint not null primary key,
    ->    authfn varchar(20),
    ->    authmn varchar(20),
    ->    authln varchar(20)
    -> )
    -> engine=innodb;
query ok, 0 rows affected (0.09 sec)

mysql>
mysql>
mysql> insert into authors values (1006, 'h', 's.', 't'),
    ->                            (1007, 'j', 'c',  'o'),
    ->                            (1008, 'b', null, 'e'),
    ->                            (1009, 'r', 'm',  'r'),
    ->                            (1010, 'j', 'k',  't'),
    ->                            (1011, 'j', 'g.', 'n'),
    ->                            (1012, 'a', null, 'p'),
    ->                            (1013, 'a', null, 'w'),
    ->                            (1014, 'n', null, 'a');
query ok, 9 rows affected (0.03 sec)
records: 9  duplicates: 0  warnings: 0

mysql>
mysql>
mysql> create table authorbook(
    ->    authid smallint not null,
    ->    bookid smallint not null,
    ->    primary key (authid, bookid),
    ->    foreign key (authid) references authors (authid),
    ->    foreign key (bookid) references books (bookid)
    -> )
    -> engine=innodb;
query ok, 0 rows affected (0.09 sec)

mysql>
mysql>
mysql> insert into authorbook values (1006, 14356),
    ->                               (1008, 15729),
    ->                               (1009, 12786),
    ->                               (1010, 17695),
    ->                               (1011, 15729),
    ->                               (1012, 19264),
    ->                               (1012, 19354),
    ->                               (1014, 16284);
query ok, 8 rows affected (0.03 sec)
records: 8  duplicates: 0  warnings: 0

mysql>
mysql>
mysql> select * from authors;
+--------+--------+--------+--------+
| authid | authfn | authmn | authln |
+--------+--------+--------+--------+
|   1006 | h      | s.     | t      |
|   1007 | j      | c      | o      |
|   1008 | b      | null   | e      |
|   1009 | r      | m      | r      |
|   1010 | j      | k      | t      |
|   1011 | j      | g.     | n      |
|   1012 | a      | null   | p      |
|   1013 | a      | null   | w      |
|   1014 | n      | null   | a      |
+--------+--------+--------+--------+
9 rows in set (0.00 sec)

mysql> select * from books;
+--------+----------------+-----------+
| bookid | booktitle      | copyright |
+--------+----------------+-----------+
|  12786 | java           |      1934 |
|  13331 | mysql          |      1919 |
|  14356 | php            |      1966 |
|  15729 | perl           |      1932 |
|  16284 | oracle         |      1996 |
|  17695 | pl/sql         |      1980 |
|  19264 | javascript     |      1992 |
|  19354 | www.java2s.com |      1993 |
+--------+----------------+-----------+
8 rows in set (0.00 sec)

mysql> select * from authorbook;
+--------+--------+
| authid | bookid |
+--------+--------+
|   1009 |  12786 |
|   1006 |  14356 |
|   1008 |  15729 |
|   1011 |  15729 |
|   1014 |  16284 |
|   1010 |  17695 |
|   1012 |  19264 |
|   1012 |  19354 |
+--------+--------+
8 rows in set (0.00 sec)

mysql>
mysql>
mysql> select bookid, booktitle
    -> from books as b
    -> where not exists
    ->    (
    ->       select bookid
    ->       from authorbook as ab
    ->       where b.bookid=ab.bookid
    ->    )
    -> order by booktitle;
+--------+-----------+
| bookid | booktitle |
+--------+-----------+
|  13331 | mysql     |
+--------+-----------+
1 row in set (0.00 sec)

mysql>
mysql> drop table authorbook;
query ok, 0 rows affected (0.03 sec)

mysql> drop table books;
query ok, 0 rows affected (0.05 sec)

mysql> drop table authors;
query ok, 0 rows affected (0.05 sec)

可以通过使用 exists 条件句防止插入重复记录。

示例一:插入多条记录
假设有一个主键为 client_id 的 clients 表,可以使用下面的语句:

code:

insert into clients
(client_id, client_name, client_type)
select supplier_id, supplier_name, 'advertising'
from suppliers
where not exists (select * from clients
where clients.client_id = suppliers.supplier_id);

时间: 2024-09-23 16:01:11

EXISTS 条件句防止插入重复记录的相关文章

新手求教 php查询 遍历数据库 多条符合条件数据输出的记录只有一条

问题描述 新手求教 php查询 遍历数据库 多条符合条件数据输出的记录只有一条 ($result = 0;//搜索结果默认值(不搜索) 1=正确搜索到结果2=搜索到结果但非第一次3=没搜索到结果4=系统提示) if($msg0 == 1){ ///号信息 $sql=""select * from tgs_code where bianhao='$bianhao'""; //sql语句在数据库查询可返回多条记录 ///echo $sql; $res=mysql_que

sql-SQL条件编写,单记录多属性合并结果

问题描述 SQL条件编写,单记录多属性合并结果 表中的记录如下所示:用户编号 属性001 A001 B002 A002 C002 E需要的记录如上: 001 A B002 A C E 如何编写SQL语句? 解决方案 这个分组,拼接值就可以了,你的是什么数据库啊? 解决方案二: 假如是mysql的比较简单SELECT group_concat(属性),用户编号 FROM 表 group by 用户编号 解决方案三: 自己参考我发的吧,你根据你自己的数据库来,mysql的就比较简单 解决方案四: -

关于ASP.NET满足条件下的插入记录

问题描述 protectedvoidbtnClickOK_Click(objectsender,EventArgse){stringStoreID=this.txtStoreID.Text.Trim();stringStoreDate=this.txtStoreDate.Text;stringStoreType=this.ddlStoreType.Text.Trim();stringStorePlace=this.ddlStorePlace.SelectedValue.ToString();st

MySQL 当记录不存在时插入(insert if not exists)

问题:我创建了一个表来存放客户信息,我知道可以用 insert 语句插入信息到表中,但是怎么样才能保证不会插入重复的记录呢? 答案:可以通过使用 EXISTS 条件句防止插入重复记录. 示例一:插入多条记录 假设有一个主键为 client_id 的 clients 表,可以使用下面的语句:  代码如下 复制代码 INSERT INTO clients (client_id, client_name, client_type) SELECT supplier_id, supplier_name,

SQL查询中in和exists的区别分析_MsSql

select * from A where id in (select id from B); select * from A where exists (select 1 from B where A.id=B.id); 对于以上两种情况,in是在内存里遍历比较,而exists需要查询数据库,所以当B表数据量较大时,exists效率优于in. 1.select * from A where id in (select id from B); in()只执行一次,它查出B表中的所有id字段并缓存

SQL中Exists的用法

比如在Northwind数据库中有一个查询为 SELECT c.CustomerId,CompanyName FROM Customers c WHERE EXISTS( SELECT OrderID FROM Orders o WHERE o.CustomerID=c.CustomerID) 这里面的EXISTS是如何运作呢?子查询返回的是OrderId字段,可是外面的查询要找的是CustomerID和CompanyName字段,这两个字段肯定不在OrderID里面啊,这是如何匹配的呢? EX

mysql 记录不存在时插入 记录存在则更新的实现方法_Mysql

mysql 记录不存在时插入在 MySQL 中,插入(insert)一条记录很简单,但是一些特殊应用,在插入记录前,需要检查这条记录是否已经存在,只有当记录不存在时才执行插入操作,本文介绍的就是这个问题的解决方案. 问题:我创建了一个表来存放客户信息,我知道可以用 insert 语句插入信息到表中,但是怎么样才能保证不会插入重复的记录呢? 答案:可以通过使用 EXISTS 条件句防止插入重复记录. 示例一:插入多条记录 假设有一个主键为 client_id 的 clients 表,可以使用下面的

SQL查询中in和exists的区别分析

select * from A where id in (select id from B); select * from A where exists (select 1 from B where A.id=B.id); 对于以上两种情况,in是在内存里遍历比较,而exists需要查询数据库,所以当B表数据量较大时,exists效率优于in. 1.select * from A where id in (select id from B); in()只执行一次,它查出B表中的所有id字段并缓存

sql-access查询符合条件的记录

问题描述 access查询符合条件的记录 怎样用sql语言以表2中group字段中"a"为条件查询表1的记录,表3为结果. 表1 id name zid 1 王朝 1,2,3,5,6 2 马汉 2,5,9 3 张龙 1,6,12,15,18 4 赵虎 2,6,23,25 5 奥巴马 3,6,8,15,19 表2 id group zid 1 a 1 2 a 3 3 a 6 4 a 8 5 b 12 6 b 2 7 b 15 8 b 19 9 b 23 表3 id name zid 1