mysqlの予約語でハマった

いつだっておもしろい事を考えているムカイです。

とても簡単に扱えて便利なmysql。

しかしそんな楽しいmysqlにも予約語という罠(?)が潜んでいます

先日、mysqlで軽くDBを作ってデータを入れようとした時、まったくinsertができない事態に陥りました。

ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'unique, sentence, url, deleted_at, created_at) VALUES ('9f075c89e1ce5c08cea7',' at line 1

なんでなんでと調べた結果、答えは「予約語」でした

そんなわけで今回はハマりにハマったmysqlの使ってはいけない予約語のお話です

予約語って?

その名の通り、プログラミング言語の仕様で予約された(定められた)単語で

プログラマが自由に使えないものです

「if」「for」「while」などが多くの言語で予約語になっています

mysqlでの予約語

当然mysqlにも予約語があります

クエリを発行する時に使用するinsertやunionなどはもちろん予約語になっています

ハマりやすい予約語

というわけで(個人的に)ハマりやすい予約語

unique

check

group

lock

option

update

などが挙げられます。

カラム名に_xxx(アンダースコア + なにがし)を足すなどしておけば

回避できる場合が多いです。

なにがしはatだったりflagだったりします

少し例外ですが、symfonyではpropelを使ってる場合に限り

カラム名にcountを使用するとpropelの予約語として認識されます。

MySQL ver4.1 予約語一覧

たくさんあります。びっくりですね

ADD ALL ALTER ANALYZE AND AS ASC BEFORE BETWEEN BIGINT BINARY BLOB BOTH BY CASCADE CASE CHANGE CHAR CHARACTER CHECK COLLATE COLUMN COLUMNS CONSTRAINT CONVERT CREATE CROSS CURRENT_DATE CURRENT_TIME CURRENT_TIMESTAMP CURRENT_USER DATABASE DATABASES DAY_HOUR DAY_MICROSECOND DAY_MINUTE DAY_SECOND DEC DECIMAL DEFAULT DELAYED DELETE DESC DESCRIBE DISTINCT DISTINCTROW DIV DOUBLE DROP DUAL ELSE ENCLOSED ESCAPED EXISTS EXPLAIN FALSE FIELDS FLOAT FLOAT4 FLOAT8 FOR FORCE FOREIGN FROM FULLTEXT GRANT GROUP HAVING HIGH_PRIORITY HOUR_MICROSECOND HOUR_MINUTE HOUR_SECOND IF IGNORE IN INDEX INFILE INNER INSERT INT INT1 INT2 INT3 INT4 INT8 INTEGER INTERVAL INTO IS JOIN KEY KEYS KILL LEADING LEFT LIKE LIMIT LINES LOAD LOCALTIME LOCALTIMESTAMP LOCK LONG LONGBLOB LONGTEXT LOW_PRIORITY MATCH MEDIUMBLOB MEDIUMINT MEDIUMTEXT MIDDLEINT MINUTE_MICROSECOND MINUTE_SECOND MOD NATURAL NOT NO_WRITE_TO_BINLOG NULL NUMERIC ON OPTIMIZE OPTION OPTIONALLY OR ORDER OUTER OUTFILE PRECISION PRIMARY PRIVILEGES PROCEDURE PURGE RAID0 READ REAL REFERENCES REGEXP RENAME REPLACE REQUIRE RESTRICT REVOKE RIGHT RLIKE SECOND_MICROSECOND SELECT SEPARATOR SET SHOW SMALLINT SONAME SPATIAL SQL_BIG_RESULT SQL_CALC_FOUND_ROWS SQL_SMALL_RESULT SSL STARTING STRAIGHT_JOIN TABLE TABLES TERMINATED THEN TINYBLOB TINYINT TINYTEXT TO TRAILING TRUE UNION UNIQUE UNLOCK UNSIGNED UPDATE USAGE USE USING UTC_DATE UTC_TIME UTC_TIMESTAMP VALUES VARBINARY VARCHAR VARCHARACTER VARYING WHEN WHERE WITH WRITE X509 XOR YEAR_MONTH ZEROFILL

まとめ

予約語っぽいのをつけない!

名前をつける時はひと工夫が大事ですね

カヤックでは、mysqlが楽しくて仕方がないエンジニアを募集しています