2017-05-01 8 views
0

私はSQLを学習しており、データベースに値を挿入する必要がある状況にあります。一意の場合にのみ挿入します(2行を確認してください)

私のテーブルビューの構造は、このようなものです:私はそこfirst_id 1second_id 2があると私は再びそれを追加していテーブル内の場合、同じfirst_idsecond_idなどが存在しない場合にのみ挿入したい

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

、私はしないでくださいもうそれを追加したい。したがって、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のように実行しようとしましたが、それらは動作しませんでした。私はこれにどのようにアプローチすべきですか?

+0

'first_id'が1、' second_id'が1または3ならば挿入できますか?それは挿入しないために2でなければならないのですか? – Sajal

+0

はい、もしそれらの値が 'first_id'のようなものが2で' second_id'が4ならば私は許します。 –

答えて

4

これは簡単です。 first_idsecond_idcomposite keyと宣言します。私はあなたのPHPコードに変更を加えるのではなく、重複した値を受け入れないようにDB構造を汎用的にすることを好むでしょう。

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); 

+0

それは最高のものでした:)ありがとう。しかし、私はこれをどのように捕まえることができるか教えていただけますか?私はそれが起こったら内部に行きたくはありません。 500の代わりに私は400か何かを得たいと思う。 –

+0

私の喜び:)助けて嬉しいです。 –

0

第一および第二のIDの存在を確認し、さらに第一および第二のIDの2つのSQL変数を宣言し、必要ごとにそれらを設定します。一致したレコードのカウントが0であれば

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; 

条件は挿入する:あなたはPHPとMySQLを使用している場合

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

私は今、ばかげているかもしれませんが、PHPの ' - > query(" ")'関数を使用してクエリを実行している場合、どのように追加するべきですか? –

+0

私はPHPでこれを達成する方法を特定できません、私は自分自身のネットプロです。ごめんなさい。 – Sajal

1

あなたはこれを試すことがあります。

<?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(); 
    } 
?> 
関連する問題