【问题标题】:SQL bad attribute (column) namesSQL 错误属性(列)名称
【发布时间】:2015-06-01 11:05:21
【问题描述】:

我已经使用查询在 MySQL 数据库中创建了表:

CREATE TABLE IF NOT EXISTS `CREW` (
`ID` INT NOT NULL,
`CALL` VARCHAR(45) NULL DEFAULT NULL,
PRIMARY KEY (`ID`));

它确实工作得很好,但是当我尝试这样做时:

INSERT INTO CREW (ID, CALL) VALUES (0, 'None');

我有ERROR 1064。我们应该避免的其他坏名是什么?

【问题讨论】:

  • 可能是“呼叫”属性?尝试更改它的名称
  • 我不是不同 DBMS 的专家 - 所以最好有一些属性命名技术以防止与不同 DBMS 中的保留字(现有或可能出现的)发生冲突(不仅在 MySQL 中,但在 Derby 中也是如此)

标签: mysql database database-schema


【解决方案1】:
  1. 它被称为列,而不是属性;)

  2. 不要对列名使用保留字。 MySQL 列表在这里:https://dev.mysql.com/doc/refman/5.0/en/reserved-words.html。多数据库列表:https://www.drupal.org/node/141051

  3. 如果您希望您的 SQL 与其他数据库兼容,则应使用较低的 snake_case

【讨论】:

  • 是的,没错。我认为它是一种关系发展。这是我想知道的。但是,为什么是 snake_case 而不是 CamelCase
  • 关系开发 - 我的意思是如何正确设置属性名称,例如在 MySQL Workbench 中,以便有 good 自动生成的查询。
  • @UmbraAeternitatis 由于其他数据库中的怪异(咳嗽 postgres)snake_case 是唯一的跨数据库替代方案
【解决方案2】:

您应该像在 create 语句中那样做。 用反引号将属性名和表名括起来:

INSERT INTO `CREW` (`ID`, `CALL`) VALUES (0, 'None');

如果你总是这样,你不需要避免任何名字。

【讨论】:

  • 是的,这个确实有效。但这不适用于ALTER TABLE `CREW` RENAME COLUMN `CALL` TO `CALLSIGN`;
  • 如果我为 MySQL backticks-hack 生成查询,可能会导致与其他 DBMS 不兼容。
【解决方案3】:

CREW 表中的列名称之一是“CALL”。 CALL statement 用于调用存储过程。所以当你在执行时

INSERT INTO CREW (ID, CALL) VALUES (0, 'None');

Mysql 了解您正在尝试执行存储过程。所以你需要用反引号包围属性名称

INSERT INTO CREW ('ID', 'CALL') VALUES (0, 'None');

【讨论】:

  • 还有一件事 - 这个技巧与 backticks DBMS 无关吗?
  • 不,反引号不独立于 DBMS。反引号不符合 ANSI-SQL,例如它们在 SQL Server 中不起作用。
  • 所以我们只需要避免保留字作为属性名称,以便对数据库进行良好查询,不是吗?
  • 是的。你是对的。通常建议尽可能避免使用保留关键字作为列或表标识符,以避免引用问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-11-02
  • 2010-09-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多