0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

cakePHP4のmigrationで発生したSyntaxエラーの解消

Last updated at Posted at 2024-05-28

発生したエラー

クエリビルダを使用してupdate文を作成した時に以下のエラーが発生しました。(コードは以下の通り)やりたかったことはorderカラムの値のアップデートです。

$this->getQueryBuilder()
    ->update('my_table')
    ->set([
        'order' => xx,
    ])
    ->where(['id' => xx])
    ->execute();

このコードを実行すると以下のエラーが吐かれました。

PDOException: SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'order = 'xx' WHERE id = 'xx'' at line 1 in ...\vendor\cakephp\cakephp\src\Database\Statement\MysqlStatement.php:39

調査と原因

実際に実行されていたSQLは以下のものでした。

UPDATE my_table SET order = :c0 WHERE id = :c1

原因はカラム名のorderがMySQLで予約されている単語のため、エラーとなっていました。

解決

まず試したことは、予約語を使用する時はMySQLだとバッククォートで囲うと実行できることが以下のサイトから分かったので試してみました。
https://gihyo.jp/dev/serial/01/mysql-road-construction-news/0170

しかし実行結果はエラーでした。orderが消えてしまった・・

"UPDATE my_table SET  = :c0 WHERE id = :c1"		

次に以下のようにカラム名の前にテーブル名を指定してあげると問題なく実行できました。

$this->getQueryBuilder()
    ->update('my_table')
    ->set([
        'my_table.order' => xx,
    ])
    ->where(['id' => xx])
    ->execute();

所感

・MySQLの予約語をカラムに使用しているケースに初めて遭遇したので学びになりました。
・自分がテーブル設計する時はカラム名に予約語を使用するのは、避けようと思います。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?