Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/257.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如果SQL没有插入内容,如何使用SQL插入内容';不存在,如果存在,请将其删除?_Php_Mysql_Sql_Insert_Sql Insert - Fatal编程技术网

Php 如果SQL没有插入内容,如何使用SQL插入内容';不存在,如果存在,请将其删除?

Php 如果SQL没有插入内容,如何使用SQL插入内容';不存在,如果存在,请将其删除?,php,mysql,sql,insert,sql-insert,Php,Mysql,Sql,Insert,Sql Insert,我试图用PHP编写一个SQL查询,创建一个新行,除非该行已经存在,否则删除它 我知道我可以通过一个SELECT来完成这项工作,看看它是否在那里,然后执行一个简单的if语句来运行下一个查询。没问题。然而,我相信有一种方法可以通过一个查询来实现这一点,我想学习一下 我有一个名为“people”的表,它有四列:ID(唯一)、Name、Phone、Date。我的程序添加了一个姓名和电话号码,并将其填入我的表中。如果我添加一个已经在系统中的人,我希望它删除该人的信息。由于ID是递增分配的,并且Date只是

我试图用PHP编写一个SQL查询,创建一个新行,除非该行已经存在,否则删除它

我知道我可以通过一个SELECT来完成这项工作,看看它是否在那里,然后执行一个简单的if语句来运行下一个查询。没问题。然而,我相信有一种方法可以通过一个查询来实现这一点,我想学习一下

我有一个名为“people”的表,它有四列:ID(唯一)、Name、Phone、Date。我的程序添加了一个姓名和电话号码,并将其填入我的表中。如果我添加一个已经在系统中的人,我希望它删除该人的信息。由于ID是递增分配的,并且Date只是我添加信息时的一个日期时间戳,因此我希望对照姓名和电话作为判断这是否是唯一条目的标准

这是我迄今为止的INSERT语句:

$sql = "INSERT INTO people (ID, name, phone, date)";
它起作用了。我还有一个语句,它使用SELECT确定行是否存在,如果不存在,则运行此脚本。这可能太复杂了

我已经研究过了,并且找到了关于这个的最少的信息。(所以可能有更好的方法吗?)我找到了一些资源,比如,它不能完全回答我的问题,因为我需要将它与我的“姓名”和“电话”列进行比较,而不是唯一的ID


谢谢你的帮助

仅当不存在基于任何列的任何数据时,才可以插入

INSERT INTO table (ID, name, phone, date) 
  SELECT '', 'anything', 'anything', 'anydate' 
  FROM dual 
  WHERE NOT EXISTS
        ( SELECT name, phone
          FROM table
          WHERE name = '35.86' AND phone = 'phonenumberhere'
        ); 

这类似于运行另一个select语句,但对性能几乎没有好处。

我怀疑您想替换该行,而不是删除它。这里有一种方法:

insert into t (id, name, phone, date)
    values (id, name, phone, date)
    on duplicate key set id = values(id), date = values(date);
这假设
(姓名、电话)
具有唯一索引或声明为主键:

create unique index unq_t_name_phone on t(name, phone);

也许可以研究一下
REPLACE
,它的工作原理与
INSERT
完全相同,只是如果表中的一个旧行与
主键
唯一
索引的新行具有相同的值,则在插入新行之前会删除旧行。请看@Brendan。没有办法在同一语句中执行硬
delete
insert
(除非可以使用某些触发器)。也就是说,为什么不使用软删除呢。也就是说,在数据中有一个标志指定行是否有效。您可以在同一语句中执行
update
delete