如果行不存在,则仅插入行
我正在建立一个点击计数器。 我有一个文章目录和跟踪唯一访问者。 当访问者来时,我将文章ID及其IP地址插入数据库中。 首先,我检查文章id是否存在ip,如果ip不存在,我进行插入。 这是两个查询 – 有没有办法进行这一个查询
另外,我没有使用存储过程我使用常规内联sql
以下是一些选项:
INSERT IGNORE INTO `yourTable` SET `yourField` = 'yourValue', `yourOtherField` = 'yourOtherValue';
来自MySQL参考手册:“如果使用IGNORE关键字,则执行INSERT语句时发生的错误将被视为警告。例如,如果没有IGNORE,则复制表中现有UNIQUE索引或PRIMARY KEY值的行会导致重复键错误,语句被中止。“。)如果该记录尚不存在,则将创建该记录。
另一种选择是:
INSERT INTO yourTable (yourfield,yourOtherField) VALUES ('yourValue','yourOtherValue') ON DUPLICATE KEY UPDATE yourField = yourField;
不抛出错误或警告。
是的,您在article_id和ip_address列上创建UNIQUE约束。 当您尝试INSERT复制时,INSERT将被拒绝并显示错误。 刚刚在这里为SQLite回答了同样的问题。
IF NOT EXISTS (SELECT * FROM MyTable where IPAddress...) INSERT...
不是SQL Server。 使用T-SQL,您必须检查是否存在行,然后根据需要使用INSERT或UPDATE。
另一种选择是首先尝试UPDATE,然后检查行计数以查看是否有更新的记录。 如果没有,那么INSERT。 如果连续出现50/50的可能性,则您在50%的时间内执行了单个查询。
MySQL有一个名为REPLACE的扩展,它具有您所寻求的function。
我能想到的唯一方法是使用SqlCommand
对象执行动态SQL。
IF EXISTS(SELECT 1 FROM IPTable where IpAddr=) --Insert Statement
我同意Larry关于使用唯一性的观点,但我会像这样实现它:
-
IP_ADDRESS
,pk -
ARTICLE_ID
,pk,fk
这可以确保记录是唯一的。 尝试插入重复项会从数据库中收到错误。
我真的会用程序! 🙂
但不管怎样,这可能会奏效:
为IP和文章ID列创建一个UNIQUE索引,如果插入查询已经存在,则插入查询将失败,因此从技术上讲它将起作用! (在mysql上测试)
尝试这个(这是一个真正的kludge,但它应该工作……):
Insert TableName ([column list]) Select Distinct @PK, @valueA, @ValueB, etc. -- list all values to be inserted From TableName Where Not Exists (Select * From TableName Where PK == @PK)