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