- PR -

Mysql カラムの型でInsertを制御したい

1
投稿者投稿内容
kbr
会議室デビュー日: 2003/10/16
投稿数: 14
投稿日時: 2005-09-07 16:43
MySQLにおいて、Insertで登録される値が、カラムの型とあっていない場合、
(例えば、int型のカラムに文字'AAA'がきた場合)
Insertを実施しないよう、エラーで返したいのですが、うまくいきません。

どなたか、ご教授願います。

■事象説明
以下のテーブル構造があるとします。

CREATE TABLE todo (
ID int(11) NOT NULL default '0',
Site int(11) ,
PRIMARY KEY (ID)
) TYPE=MyISAM;

このテーブルに対して、Insertを実施します。
insert into todo values(1,100);
insert into todo values(2,"aaa");

selectすると以下のようになります。
mysql> select * from todo;
+----+------+
| ID | Site |
+----+------+
| 1 | 100 |
| 2 | 0 |
+----+------+
2 rows in set (0.00 sec)

aaaが勝手に0に置き換わって、登録されてしまいます。
2行目は登録されず、エラーで返すためにはどのようにすればよろしいでしょうか?
冬寂
ぬし
会議室デビュー日: 2002/09/17
投稿数: 449
投稿日時: 2005-09-07 17:10
引用:

insert into todo values(2,"aaa");
↑この場合、"aaa"は、"aaa"というフィールドの値となる。
("aaa"は無いから、0とかfalseとかになる・・・のではないかと。)


とりあえず、リテラルはシングルクォートで囲む必要がありますよ。
kbr
会議室デビュー日: 2003/10/16
投稿数: 14
投稿日時: 2005-09-07 18:21
さっそくのご回答ありがとうございました。

insert into todo values(1,100);
insert into todo values(2,'aaa');

上記でやってみましたが、結果は同じでした。
+----+------+
| ID | Site |
+----+------+
| 1 | 100 |
| 2 | 0 |
+----+------+
2 rows in set (0.00 sec)
kbr
会議室デビュー日: 2003/10/16
投稿数: 14
投稿日時: 2005-09-07 18:24
insert into todo values(1,100);
insert into todo values(2,aaa);

ちなみに、上記でやったら、
ERROR 1054 at line 2: Unknown column 'aaa' in 'field list'

となりました。当たり前といったら、当たり前ですが・・
Java僧
ぬし
会議室デビュー日: 2003/11/06
投稿数: 261
投稿日時: 2005-09-08 08:49
MySQLは使ってないのですが、マニュアルに、

> 数値型のカラムへの '10.34 a' などの値の設定。この場合、後続のガーベジは除去され、
> 残りの数値の部分だけが挿入される。値が数値として意味をなさない場合、
> カラムの値は 0 に設定される。

と書かれているので、仕様のようですね。

また、同じページに

> MySQL では、フィールド内容のチェックはデータベースサーバではなく
> アプリケーション側で行う、という見解に立っている。

という解説があります。

http://dev.mysql.com/doc/mysql/ja/insert.html

ちょっと変わったRDBMSですね。
kbr
会議室デビュー日: 2003/10/16
投稿数: 14
投稿日時: 2005-09-15 13:49
なるほど、ありがとうございました。

DBではじけるエラーはDB側にしたかったのですが・・・

ま、タダだから、しょうがないか・・
1

スキルアップ/キャリアアップ(JOB@IT)