仅在唯一时插入(检查2行)

时间:2017-05-01 10:15:14

标签: php mysql sql

我正在学习SQL,而且我的情况是,只有当数据库不存在时才必须将值插入数据库。

我的tableview结构是这样的:

+----------+-----------+-----+-----+
| first_id | second_id | timestamp |
+----------+-----------+-----------+

我想仅在不同first_idsecond_id的情况下插入,例如,如果在表格中有first_id 1second_id 2并且我再次添加它,我会不想再添加了。因此,如果first_id和second_id行已经有值1和2,那么请不要添加,但如果first_id为3且second_id为1,那么我将允许插入。

这是我的查询ATM:

INSERT INTO  `testtable`.`ids` (`first_id`, `second_id`) VALUES (:first_id, :second_id)

就像这样,我尝试使用NOT EXISTS,但它无效:

NOT EXISTS (SELECT first_id, second_id FROM `testtable`.`ids` WHERE first_id = : first_id AND second_id = : second_id) INSERT INTO  `testtable`.`ids` (`first_id `, `second_id `) VALUES (: first_id, : second_id)

最后提到的查询给了我语法错误,但是一旦我得到完整性违规,它就告诉我检查文档。

我正在使用PHP ->query("");函数执行查询。

我试着像IF NOT EXISTSNOT EXISTS那样做,但那些没有用。我该怎么做呢?

3 个答案:

答案 0 :(得分:4)

这很简单。将first_idsecond_id声明为composite key。我不希望在您的PHP代码中进行任何更改,但会使您的数据库结构变得多样化,以便它不会接受任何重复的值,无论您如何插入它。

CREATE TABLE `demo` (
  `first_id` smallint(6) DEFAULT NULL,
  `second_id` smallint(6) DEFAULT NULL,
  `timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  UNIQUE KEY `first_id` (`first_id`,`second_id`)
)

现在first_idsecond_id永远不会接受重复的值。enter image description here

^表包含值(1,2)。现在插入(1,3)。

enter image description here

^表接受(1,3)。现在再次插入(1,2)。

enter image description here

insert语句抛出错误。现在,表永远不会接受键的重复值(first_id,second_id)。

如果该表已存在且您没有从头开始创建,只需执行:

alter table `table_name` add unique key (first_id, second_id);

这将阻止此后的重复值。

答案 1 :(得分:1)

如果您使用的是PHP和MySql,可以试试这个:

<?php

    //Added database connection code here 

    $first_id = $_POST['first_id '];
    $second_id = $_POST['second_id '];


    $sql = "select * from ids where first_id = ".$first_id ." and second_id  ='".$second_id."'" ;
    $result = $mysqli->query($sql);
    $row = $result->fetch_row();

    if($row[0]) {
        $mysqli->close();
    } else {
        //preapare an insert statement
        $stmt = $mysqli->prepare(" INSERT INTO `ids` (first_id, second_id) VALUES (?,?)");
        $stmt->bind_param("ii", $first_id, $second_id);

            //execute the statement
            if( $stmt->execute() ) {
                unset($first_id);
                unset($second_id);
            } else {
                echo $mysqli->error;
            }       
        //close statement
        $stmt->close();     
        $mysqli->close();
    }
?>

答案 2 :(得分:0)

检查第一个和第二个id是否存在,并为第一个和第二个id声明2个sql变量,并根据需要设置它们。

DECLARE @Exists int; @first_id int; @second_id int;
SET @first_id = 1;
SET @second_id = 2;
SELECT @Exists = COUNT(*) FROM [testtable] where [first_id] = @first_id and [second_id] = @second_id;

如果匹配记录的数量为0,则插入条件:

IF(@Exists = 0)
BEGIN 
    INSERT INTO  [testtable](first_id, second_id)
    VALUES(@first_id,@second_id)
END