SQLITE3でUNIQUE制約をつけたカラムにクライアント側から送られてきた値を更新する機能を作っています。
しかし、登録してあるものと同じ値が送られた場合、UNIQUEが含まれていますのエラーが発生しました。
同じ値の場合は、更新する前にバリデーションを行った結果、エラーが起きているのだと推測しています。
以下のページのように、自分自身はバリデーション対象から外すことはSQLITEではできないのでしょうか?
Laravel5のバリデーションの重複チェックで自分自身は除外する方法
現在の対応としては、すでにクライアント側でもし値が同じならUPDATEのリクエストを送らないようにして、解決しましたが、
上記のようなことができるか気になり質問しました。
よろしくお願いします。
以下のSQLite文を実行しています。
SQL
1 2CREATE TABLE `project` ( 3 `プロジェクト_id` INTEGER PRIMARY KEY AUTOINCREMENT, 4 `プロジェクト名` VARCHAR ( 20 ) NOT NULL DEFAULT 'no project name' UNIQUE 5 `プレフィックス` VARCHAR ( 10 ) NOT NULL DEFAULT 'WP' UNIQUE, 6 `count` INTEGER NOT NULL DEFAULT 0, 7 ); 8 9INSERT INTO project(projectName) VALUES('WP'); 10 11UPDATE project SET projectName='WP' WHERE projectId id=22;
ただ、もう一度DB browsere for Sqlite のDBツールで試した結果
エラーにはなりませんでした。
実装はPHPで行っています。
php
1$data = $_POST["Data"]; 2 if (isset($data["プロジェクト_id" ])) { $projectID = $data["プロジェクト_id"];} 3 if (isset($data["プロジェクト名" ])) { $projectName = $data["プロジェクト名"];} 4 if (isset($data["プレフィックス" ])) { $prefix = $data["プレフィックス"];} 5 if (isset($data["説明"])) { $description = $data["説明"];} 6 7try { 8 $stmt = $db->prepare(" 9 UPDATE プロジェクト SET 10 プロジェクト名=:projectName, プレフィックス=:prefix, 説明=:description 11 WHERE プロジェクト_id=:projectID 12 ;"); 13 14 $stmt->bindParam(":projectName", $projectName); 15 $stmt->bindParam(":prefix", $prefix); 16 $stmt->bindParam(":description", $description); 17 $stmt->bindParam(":projectID", $projectID); 18 19 $stmt->execute(); 20 21 $result["Result"]= true; 22 23 } catch (PDOException $e) { 24 $result["Result"]= false; 25 $result["Reason"] = $e->getMessage(); 26 }
DBには以下のレコードがあります。
プロジェクト_id | プロジェクト名 | プレフィックス | 説明 |
---|---|---|---|
︙ | ︙ | ︙ | ︙ |
18 | テスト | test | テストプロジェクト |
クライアント側ではDBから取得した値を表示していますので、
値に変更がない場合でもData配列を送り、SQL文を組み立てています。
このレコードに対して上記のPHPを実行したところ以下のエラーが帰ってきました。
SQLSTATE[23000]: Integrity constraint violation: 19 column プレフィックス is not unique
回答1件
あなたの回答
tips
プレビュー