SQLITEでUNIQUE要素を同じ値でUPDATEする
- 評価
- クリップ 0
- VIEW 1,725
SQLITE3でUNIQUE制約をつけたカラムにクライアント側から送られてきた値を更新する機能を作っています。
しかし、登録してあるものと同じ値が送られた場合、UNIQUEが含まれていますのエラーが発生しました。
同じ値の場合は、更新する前にバリデーションを行った結果、エラーが起きているのだと推測しています。
以下のページのように、自分自身はバリデーション対象から外すことはSQLITEではできないのでしょうか?
Laravel5のバリデーションの重複チェックで自分自身は除外する方法
現在の対応としては、すでにクライアント側でもし値が同じならUPDATEのリクエストを送らないようにして、解決しましたが、
上記のようなことができるか気になり質問しました。
よろしくお願いします。
以下のSQLite文を実行しています。
CREATE TABLE `project` (
`プロジェクト_id` INTEGER PRIMARY KEY AUTOINCREMENT,
`プロジェクト名` VARCHAR ( 20 ) NOT NULL DEFAULT 'no project name' UNIQUE
`プレフィックス` VARCHAR ( 10 ) NOT NULL DEFAULT 'WP' UNIQUE,
`count` INTEGER NOT NULL DEFAULT 0,
);
INSERT INTO project(projectName) VALUES('WP');
UPDATE project SET projectName='WP' WHERE projectId id=22;
ただ、もう一度DB browsere for Sqlite のDBツールで試した結果
エラーにはなりませんでした。
実装はPHPで行っています。
$data = $_POST["Data"];
if (isset($data["プロジェクト_id" ])) { $projectID = $data["プロジェクト_id"];}
if (isset($data["プロジェクト名" ])) { $projectName = $data["プロジェクト名"];}
if (isset($data["プレフィックス" ])) { $prefix = $data["プレフィックス"];}
if (isset($data["説明"])) { $description = $data["説明"];}
try {
$stmt = $db->prepare("
UPDATE プロジェクト SET
プロジェクト名=:projectName, プレフィックス=:prefix, 説明=:description
WHERE プロジェクト_id=:projectID
;");
$stmt->bindParam(":projectName", $projectName);
$stmt->bindParam(":prefix", $prefix);
$stmt->bindParam(":description", $description);
$stmt->bindParam(":projectID", $projectID);
$stmt->execute();
$result["Result"]= true;
} catch (PDOException $e) {
$result["Result"]= false;
$result["Reason"] = $e->getMessage();
}
DBには以下のレコードがあります。
プロジェクト_id | プロジェクト名 | プレフィックス | 説明 |
---|---|---|---|
︙ | ︙ | ︙ | ︙ |
18 | テスト | test | テストプロジェクト |
クライアント側ではDBから取得した値を表示していますので、
値に変更がない場合でもData配列を送り、SQL文を組み立てています。
このレコードに対して上記のPHPを実行したところ以下のエラーが帰ってきました。
SQLSTATE[23000]: Integrity constraint violation: 19 column プレフィックス is not unique
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
checkベストアンサー
0
エラーは起こりませんが?
CREATE TABLE foo(
id INTEGER PRIMARY KEY,
name TEXT UNIQUE
);
INSERT INTO foo VALUES(1,'TARO');
UPDATE foo
SET name = 'TARO'
WHERE id = 1;
SELECT * FROM foo;
エラーが起こるSQLを書いてください。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.23%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
質問への追記・修正、ベストアンサー選択の依頼
Orlofsky
2018/08/27 10:36
URLは https://teratail.com/help#about-markdown の[リンク]を使ってください。
ryuuutyenn
2018/08/27 10:44
ありがとうございます、修正しました。
otn
2018/08/27 11:34
SQLiteというより、Laravelの問題でしょう。タグを変更した方が良いです。
ryuuutyenn
2018/08/27 13:00
Laravelは使用していません、重複チェックに自分自身は含まないはLaravelの独自な機能なのでしょうか?
otn
2018/08/27 13:56
SQLを書いてください。