【发布时间】:2014-01-17 14:22:01
【问题描述】:
email_address
-------------
id
prefix
fqdn
前缀和 fqdn 共同构成一个唯一键。
如果电子邮件地址尚未在表中,我想编写一个插入查询。如果地址已经在表中,它应该返回 id。
如果合法的话,有没有办法编写一个类似于INSERT INTO email_address(prefix, fqdn) VALUES (?, ?) ON DUPLICATE SELECT id as LAST_INSERT_ID WHERE prefix = ? AND fqdn = ? 的查询?
基本上我想在一个查询中执行 INSERT 或 SELECT。
【问题讨论】:
-
不,据我所知,这在 MySQL 中是不可能的。但是,您可以在您的应用程序代码(PHP 等)中这样做,而不会有太多麻烦。
-
如果
prefix和fqdn形成 1 个唯一(主)键,您认为为什么需要id列?删除id解决了你整个无意义的工作,并尝试选择你已经拥有的东西。 -
什么是“SELECT 或 INSERT”?能有什么意义?
-
我同意@TimBurch - 我可能会在应用层中通过 default 来处理这个问题;因为
id通常最好由数据库递增,所以无论如何你必须在插入后SELECT才能得到它......尝试插入,然后在重复键失败(或不影响行,如果插入被写入那样)不要报告错误(可能),只需执行选择行,就好像什么都没发生一样。不过,对于这种设计,这里有多个问题。 -
@DanFromGermany - 拥有代理键允许更改与帐户关联的电子邮件地址(或者更容易,无论如何)。 StackExchange 可能会在后端使用它,因为我已经更改了与此帐户关联的电子邮件地址...
标签: mysql sql insert last-insert-id