【问题标题】:Oracle Sql ORA-02270: no matching unique or primary key for this column-listOracle Sql ORA-02270: 此列列表没有匹配的唯一键或主键
【发布时间】:2021-09-15 13:55:22
【问题描述】:

您好,我找不到我的 sql 代码。

这是我目前制作的代码:

create table Client_Info
(
    "Client_Name" varchar2 (30) primary key,
    "Birthday" date not null,
    "Zip_Code" number(4) not null,
    "Weapon_Rank" number(1) not null,
    "Registration_Date" date not null
)

create table Ammunition_Info
(
    "Ammo_Id" number(8) primary key,
    "Ammo_Type" varchar2(30) not null,
    "Ammo_Round" varchar2(30) not null,
    "Amount" number(2)not null
)

create table Gun_Info
(
    "Serial_Number" number(8) primary key,
    "Model_Name" varchar2(20) not null,
    "Clasification" varchar(20) not null,
    "Year_of_production" date not null,
    "Weapon_Rank" number(1) not null,
    "Ammo_Type" varchar2(30) not null,
    "Ammo_Round" varchar2(30) not null,

    constraint wrank_fk foreign key("Weapon_Rank") references Client_Info("Weapon_Rank"),
    constraint amt_fk foreign key("Ammo_Type") references Ammunition_Info("Ammo_Type"),
    constraint amr_fk foreign key("Ammo_Round") references Ammunition_Info("Ammo_Round")
)

当我尝试在 Gun_Info 表中链接外键时出现错误,我不知道出了什么问题

谁能指出我犯了什么错误

【问题讨论】:

  • 错误很明显。您的外键引用应该是每个引用表中的主键。你有什么不明白的?
  • 哦,谢谢你指出我不知道那是怎么飞到我头上的@Gordon Linoff
  • 顺便说一句,将 Client_name 作为主键是一个非常糟糕的主意。造成这种情况的原因有很多,例如,您将如何处理 2 个同名的不同人?
  • 作为一个侧面观察,通过创建用双引号括起来的列名,您正在创建区分大小写的名称。这会回来咬你。如果你想把它们写成混合大小写,那很好,但要省略双引号,这样它们就不会区分大小写,从而迫使你 always 将它们括起来——并使用确切的创建它们的案例。
  • 另一个大小观察 - 邮政编码不是 数字,它们是字符串 - 在美国 - 仅限于数字 字符。任何时候你将某个东西声明为 number 都会丢失任何前导零。基本规则:如果对元素进行算术运算是不合逻辑的,那么它就不是一个数字,不应该这样声明。

标签: sql oracle oracle-apex


【解决方案1】:

已修复,创建这些表的代码可能如下所示:

SQL> create table client_info
  2  (   client_id         number constraint pk_clinfo primary key,
  3      client_name       varchar2 (30) not null,
  4      birthday          date not null,
  5      zip_code          varchar2(4) not null,
  6      weapon_rank       number(1) not null,
  7      registration_date date not null,
  8      --
  9      constraint uk_clinfo unique (weapon_rank)
 10  );

Table created.

SQL> create table ammunition_info
  2  (   ammo_id    number(8) constraint pk_amminfo primary key,
  3      ammo_type  varchar2(30) not null,
  4      ammo_round varchar2(30) not null,
  5      amount     number(2)not null,
  6      --
  7      constraint uk_amminfo unique (ammo_type, ammo_round)
  8  );

Table created.

SQL> create table gun_info
  2  (   serial_number      number(8) constraint pk_gunifo primary key,
  3      model_name         varchar2(20) not null,
  4      clasification      varchar(20) not null,
  5      year_of_production date not null,
  6      weapon_rank        number(1) not null,
  7      ammo_type          varchar2(30) not null,
  8      ammo_round         varchar2(30) not null,
  9      --
 10      constraint wrank_fk foreign key(weapon_rank)
 11        references client_info    (weapon_rank),
 12      constraint amt_fk   foreign key(ammo_type, ammo_round)
 13        references ammunition_info(ammo_type, ammo_round)
 14  );

Table created.

SQL>

我做了什么?

  • client_id 作为主键列添加到client_info 表中
  • 命名所有约束(否则 Oracle 生成的通用名称根本没有描述性
  • 删除所有双引号以使表格和列不区分大小写
  • 将邮政编码从 number 数据类型更改为 varchar2
  • client_infoammunition_info 添加了唯一键,以便可以从gun_info 引用它们。我不知道这是否是你真正需要的

我还建议您重新阅读问题下方发布的 cmets,并尝试了解人们所说的内容和原因。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-03
    • 1970-01-01
    • 2014-05-15
    • 2022-12-14
    • 1970-01-01
    相关资源
    最近更新 更多