我有两张桌子,Table JOBTable USER,这是 struct 图

 CREATE TABLE JOB
 (
   ID       NUMBER NOT NULL ,
   USERID   NUMBER,
   CONSTRAINT B_PK PRIMARY KEY ( ID ) ENABLE
 );

 CREATE TABLE USER
 (
   ID       NUMBER NOT NULL ,
   CONSTRAINT U_PK PRIMARY KEY ( ID ) ENABLE
 );

现在,我想将引用USER表的外键约束添加到JOB,如下所示

Alter Table JOB ADD CONSTRAINT FK_USERID FOREIGN KEY(USERID) REFERENCES USER(ID);

这是Oracle (ORA-02270) : no matching unique or primary key for this column-list error,做一些调查,似乎我们需要unique key or primary key约束USERID,但我不能有,因为一个USERID可以有多个JOBS与他有关,任何 idea 或建议如何解决这个问题?

研究ORA-02270SO related question

推荐答案

ORA-2270错误是一个简单的逻辑错误:当我们在外键中列出的列与父表上的主键或唯一约束不匹配时,就会发生这种错误.造成这种情况的常见原因是

  • 父级完全缺少主键或唯一约束
  • FOREIGN KEY子句引用了父表中的错误列
  • 父表的约束是复合键,我们还没有引用FOREIGN KEY语句中的所有列.

在你发布的代码中,两者似乎都不是这样.但这是在转移视线,因为你发布的代码是does not run.从前面的编辑判断,我认为你不是在发布你的实际代码,而是在发布一些简化的示例.不幸的是,在简化的过程中,你已经消除了导致ORA-2270错误的任何因素.

SQL> CREATE TABLE JOB
 (
   ID       NUMBER NOT NULL ,
   USERID   NUMBER,
   CONSTRAINT B_PK PRIMARY KEY ( ID ) ENABLE
 );  2    3    4    5    6  

Table created.

SQL> CREATE TABLE USER
 (
   ID       NUMBER NOT NULL ,
   CONSTRAINT U_PK PRIMARY KEY ( ID ) ENABLE
 );  2    3    4    5  
CREATE TABLE USER
             *
ERROR at line 1:
ORA-00903: invalid table name


SQL> 

该语句失败,因为USER是保留关键字,因此我们无法指定表USER.我们来解决这个问题:

SQL> 1
  1* CREATE TABLE USER
SQL> a s
  1* CREATE TABLE USERs
SQL> l
  1  CREATE TABLE USERs
  2   (
  3     ID       NUMBER NOT NULL ,
  4     CONSTRAINT U_PK PRIMARY KEY ( ID ) ENABLE
  5*  )
SQL> r
  1  CREATE TABLE USERs
  2   (
  3     ID       NUMBER NOT NULL ,
  4     CONSTRAINT U_PK PRIMARY KEY ( ID ) ENABLE
  5*  )

Table created.

SQL> Alter Table JOB ADD CONSTRAINT FK_USERID FOREIGN KEY(USERID) REFERENCES USERS(ID);   

Table altered.

SQL> 

瞧!没有ORA-2270错误.

唉,我们在这里无法进一步帮助你.你的代码中有一个bug.你可以在这里发布你的代码,我们中的一个可以发现你的错误.或者你可以判断自己的代码,自己发现它.


注意:代码的早期版本将HOB.USERID定义为VARCHAR2(20).因为USER.ID被定义为一个数字,所以try 创建外键会抛出一个不同的错误:

ORA-02267:列类型与引用的列类型不兼容

避免不匹配的简单方法是使用外键语法缺省列的数据类型:

CREATE TABLE USERs
 (
   ID    number NOT NULL ,
   CONSTRAINT U_PK PRIMARY KEY ( ID ) ENABLE
 );

CREATE TABLE JOB
 (
   ID       NUMBER NOT NULL ,
   USERID   constraint FK_USERID references users,
   CONSTRAINT B_PK PRIMARY KEY ( ID ) ENABLE
 );

Database相关问答推荐

Golang Gorm和Gin无法创建具有关联的对象

什么是 CREATE VIEW IF NOT EXISTS in postgresql

在 model.save() 中处理竞争条件

免费的 SQL 比较工具

如何在运行时备份嵌入式 H2 数据库引擎?

在插入数据库之前而不是在输出时转义 HTML 是不是一个坏主意?

在 PostgreSQL 上获取数据库创建日期

将数据库表用作作业(job)队列的最佳方式是什么?

用 Python 永久存储字典的优雅方式?

是否有任何数据库支持自动索引创建?

如何产生幻读?

使用 typeORM 搜索早于日期的数据

如何将 Android 手机上的 SQLite 数据库与服务器上的 MySQL 数据库同步?

PostgreSQL 哈希索引

mysql 无法从存储引擎读取自增值

如何在 SQL Server 中总结时间字段

使用带有联合和 CLOB 字段的 Select 时出现错误 ORA-00932

Select 多模型 DBMS 时要考虑哪些因素? (OrientDB 与 ArangoDB)

SQLite3 数据库的最大连接数是多少?

如何使用 PL/SQL Developer 连接到远程 Oracle DB?