【问题标题】:Syntax error with CONSTRAINT on MySQL that worked on postgres在 postgres 上工作的 MySQL 上的 CONSTRAINT 语法错误
【发布时间】:2018-11-10 21:20:12
【问题描述】:

教授给了一个.sql文件做一些练习,下面是其中的一部分:

创建表部门

   (DEPTNO NUMERIC(2) CONSTRAINT PK_DEPT PRIMARY KEY, (error 1)
DNAME VARCHAR(14),
LOC VARCHAR(13) );

创建表 EMP

   (EMPNO NUMERIC(4) CONSTRAINT PK_EMP PRIMARY KEY, (error 2)
ENAME VARCHAR(10),
JOB VARCHAR(9),
HIREDATE DATE,
SAL NUMERIC(7,2),
DEPTNO NUMERIC(2) CONSTRAINT FK_DEPTNO REFERENCES DEPT); (error 3)

我们在课堂上用 pgadmin 3 运行了这个文件,一切都很顺利,但是我下载了 MySQL 而不是 postgres 来在家继续练习,它给出了一个错误:“意外约束”。因为它适用于 postgres 但不适用于 MySQL 可能是 MySQL 的语法错误?

【问题讨论】:

  • 每个数据库引擎使用的语法略有不同。您不能只在所有引擎上运行相同的 SQL 代码。
  • MySQL 支持各种语法,但显然不是那种。我习惯了更冗长的形式CONSTRAINT name FOREIGN KEY (columnOfThisTable) REFERENCES ThatTable (columnOfThatTable)。我认为这适用于 MySQL 和大多数其他数据库。不确定 Postgres,但可能也有。

标签: mysql sql postgresql syntax


【解决方案1】:

你应该做的更详细,每个rdbms都不一样。你不能使用你在一些rdbms工作的语句到其他rdbms

餐桌部

CREATE TABLE DEPT
(DEPTNO NUMERIC(2),
DNAME VARCHAR(14),
LOC VARCHAR(13), 
CONSTRAINT PK_DEPT PRIMARY KEY (DEPTNO));

表格文件

CREATE TABLE EMP
(EMPNO NUMERIC(4),
ENAME VARCHAR(10),
JOB VARCHAR(9),
HIREDATE DATE,
SAL NUMERIC(7,2),
DEPTNO NUMERIC(2), 
CONSTRAINT PK_EMP PRIMARY KEY (EMPNO),
CONSTRAINT FK_DEPTNO FOREIGN KEY (DEPTNO) REFERENCES DEPT(DEPTNO));

【讨论】:

  • 现在只有最后一行不起作用。但其他两个错误消失了。
  • @Pinteco 我的错.. 你可以再检查一下.. :)
【解决方案2】:

MySQL's acceptable formats 的外键在其广泛的文档中进行了描述。

其他约束选项是also shown in the documents

例如,主键:

[CONSTRAINT [symbol]] PRIMARY KEY [index_type] (key_part,...)
      [index_option] ...

作为 CREATE TABLE 的一部分,这可以在最后进行外键检查。

[CONSTRAINT [symbol]] FOREIGN KEY
    [index_name] (col_name, ...)
    REFERENCES tbl_name (col_name,...)
    [ON DELETE reference_option]
    [ON UPDATE reference_option]

reference_option:
    RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多