質問: 以下のようなテーブル定義があります。 ``` CREATE TABLE categories ( id int(11) NOT NULL AUTO_INCREMENT, title varchar(128) NOT NULL UNIQUE, PRIMARY KEY (id) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8; INSERT INTO categories (title) VALUES ('未選択'), ('たまご'), ('やさい'), ('おにく') ; ``` 諸事情あって、あるマスタデータの初期値(「未選択」)をテーブルに格納することになりました。 この初期値を用いてアプリケーションの条件分岐を書きますので、初期値がDBから削除されると色々都合が悪いです。 ので、この最初の1行目(id 1)だけは削除されないようにロックしたいです。(更新はできてもいいし、できなくてもいいです) どのようにすれば、行削除を禁止することが出来ますでしょうか? あるいは、SQLではそのようなことはできませんか?(アプリケーション側の記述で対応するべき?) 皆様ご助言の程よろしくお願いいたします。
回答: どこからどのように利用する想定か具体的に書かれていないのでわかりませんが、「未選択」自体をDBに持つ必要はないと思います。 もし、その選択肢の保存先で「未選択」を許可しているのならnullなり空なりを入れればいいだけで、基本は利用するプログラム側で付加すればいいかなと。 諸事情がどんな事情かわかりませんが、「未選択」は「実際の選択肢ではない」という認識です。 どうしてもというのでしたら、もしマスタを操作(追加や編集、削除)する画面から利用するのでしたら、データ取得時にid!=1でそもそも画面から操作できないようにするしかないかと。 念のために削除機能にもid=1が指定されたときはエラーを返すように対処は必要ですね。「編集できても良い」とのことですが、編集できる=削除できる ですので。 あと、これは蛇足ですが、実際はその選択肢を利用するテーブルが別にあるのでしょうし、外部キーを貼るなどして既に別で利用されている選択肢が削除されないように、番号がずれないようにする配慮は必要です。