質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
SQLite

SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

Q&A

解決済

1回答

1160閲覧

SQLITEでUNIQUE要素を同じ値でUPDATEする

ryuuutyenn

総合スコア9

SQLite

SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

0グッド

0クリップ

投稿2018/08/27 00:48

編集2018/08/28 02:47

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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ryuuutyenn

2018/08/27 01:44

ありがとうございます、修正しました。
otn

2018/08/27 02:34

SQLiteというより、Laravelの問題でしょう。タグを変更した方が良いです。
ryuuutyenn

2018/08/27 04:00

Laravelは使用していません、重複チェックに自分自身は含まないはLaravelの独自な機能なのでしょうか?
otn

2018/08/27 04:56

SQLを書いてください。
guest

回答1

0

ベストアンサー

エラーは起こりませんが?

SQL

1CREATE TABLE foo( 2 id INTEGER PRIMARY KEY, 3 name TEXT UNIQUE 4); 5INSERT INTO foo VALUES(1,'TARO'); 6UPDATE foo 7 SET name = 'TARO' 8 WHERE id = 1; 9SELECT * FROM foo;

エラーが起こるSQLを書いてください。

投稿2018/08/27 05:41

otn

総合スコア84423

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

otn

2018/08/27 06:22

質問のコードって、実行してませんよね?実行した物を書いてください。
ryuuutyenn

2018/08/28 02:48

お手数をおかけして申し訳ございません。 実装部分を追加しました。よろしくお願いします。
otn

2018/08/28 03:09

データが書いてないので、あまり意味のないコードです。 違うレコードに同じユニーク値を入れようとしたんでしょうとしか言いようがない。
ryuuutyenn

2018/08/28 03:50

DBから取得した値をhtmlのフィールドに渡し、変更がない場合はそのまま返されるのですが・・・ {"Func":"AddProject","Data":{"プロジェクト名":"test","プレフィックス":"test","説明":"テストプロジェクト"}}
ryuuutyenn

2018/08/28 03:57

クライアント側の実装でミスがありました。 別の処理を呼び出していたようです。 正常に処理が呼び出されるにしたとき、エラーはなく無事更新できました。 長くフォローしていただきありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問