【问题标题】:SQL Preventing Duplicate Entries if 2 Values Exist如果存在 2 个值,SQL 防止重复条目
【发布时间】:2020-06-08 01:17:56
【问题描述】:

我有一个查询,我想检查是否有 2 列具有相同的数据,如果没有添加数据,我会详细说明。

这是我的查询

INSERT INTO " . TABLE_PREFIX . "installs (
  username,userid,email,addontitle,addonversion,bburl,bbtitle,webmasteremail,cookie,dateline
) VALUES (
  '$username','$userid','$email','$addontitle','$addonversion','$bburl','$bbtitle','$webmasteremail','$cookie',NOW()
  )

我想检查 bburl 和 addontitle 是否与正在提交的条目匹配,如果匹配则不添加该条目。 让我们添加一些示例条目

1 --- test@test.com --- Addon --- 1.2 --- test.com --- test --- admin@test.com --- 1 --- ????????
1 --- test@test.com --- Addon2 --- 1.2 --- test.com --- test --- admin@test.com --- 1 --- ????????
1 --- test@test.com --- Addon --- 1.2 --- test2.com --- test --- admin@test.com --- 1 --- ????????

所有这些条目都会添加,但现在我们得到另一个条目:

1 --- test@test.com --- Addon --- 1.3 --- test2.com --- test --- admin@test.com --- 1 --- ????????

test2.com 已经安装了插件,所以我不想添加这个条目。我怎样才能防止这种情况发生?

作为一个单独的问题。如果您注意到我不想要的请求条目,似乎 test2.com 只是在更新产品,有没有办法可以修改现有值并更新已更改的内容?

【问题讨论】:

  • 你的代码看起来是容易被sql注入,所以fix that在你开始将不应该有重复的列设置为UNIQUE之前
  • @nbk 我尝试破坏此代码示例,我使 bburl 等于 value'); DROP TABLE installs;-- 这导致数据库错误。我没有提到这已经在一个 cms (vBulletin) 我不确定,但也许软件中的某些东西在保护它?
  • vbulletin 已经在电子邮件中拥有独一无二的 afaik,请查看表格。 vbulletin 只是一个 gui,在创建/安装后你会得到一个数据库,当然还有更新将会更新,其他明智的 nithings 会阻止你更改数据库,或者编辑代码,请参阅插件。

标签: mysql sql duplicates


【解决方案1】:

您可以在想要唯一的列上创建唯一索引/约束:

alter table t add constraint unq_t_bburl_addontitle unique t(bburl, addontitle)

然后在表上插入将产生错误。您可以使用on duplicate key update 避免该错误:

insert into t ( . . . )
    values ( . . . )
    on duplicate key update bburl = values(bburl);

update 什么都不做(因为值已经匹配)但这可以防止代码返回错误。

【讨论】:

  • alter 表会在插入之后出现吗?
  • @DrCustUmz 。 . .不,您添加一次约束,通常是在创建表时。然后,数据库维护您想要的数据完整性(在这种情况下是唯一性)。
  • 所以我尝试将此作为 SQL 查询运行到alter table installs add constraint unq_installs_bburl_addontitle on installs(bburl, addontitle),但它一直给我一个错误near 'on installs(bburl, addontitle)' at line 1
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-29
  • 2013-01-20
  • 2021-01-19
  • 1970-01-01
  • 2018-03-13
  • 1970-01-01
相关资源
最近更新 更多