sql server:尝试更改表以添加外键约束时出错

xtupzzrd  于 2021-07-24  发布在  Java
关注(0)|答案(1)|浏览(277)

所以我现在正在创建一个数据库,我已经成功地创建了我的表、列、主键,确保数据类型是正确的。
但是,现在,当我尝试执行数据库创建的下一步(即定义外键约束)时,我无法执行该操作,并且会出现如下错误:“外键'fk\u tweedledeer\u shiploster'的引用列列表中的列数与引用表'ship\u roster'中的主键的列数不匹配。”
这是我所有的table。这个错误现在出现在“tweedledeer”表和“ship\u lotster”表之间,我试图在其中创建一个通过“tweedle\u no”列描述关系的外键

USE MASTER
GO
IF EXISTS ( SELECT *
                   FROM MASTER ..sysdatabases
                   WHERE NAME = N'SpaceshipRaiders')
DROP DATABASE SpaceshipRaiders;
GO

CREATE DATABASE SpaceshipRaiders;
GO
USE SpaceshipRaiders;
CREATE TABLE TWEEDLEDEER(
Tweedle_No   INT,
FirstName    NVARCHAR(50) NOT NULL,
LastName     NVARCHAR(50) NOT NULL,
Birth_Date   DATETIME NOT NULL,
Dead_Date    DATETIME NOT NULL, 
Gender       NVARCHAR(50) NOT NULL,
Position     NVARCHAR(50) NOT NULL,
Father       INT NOT NULL,
Mother       INT NOT NULL
CONSTRAINT tweedledeer_pk PRIMARY KEY (Tweedle_No)
CONSTRAINT FK_TWEEDLEDEER_TWEEDLEDEER1 FOREIGN KEY (Father) REFERENCES TWEEDLEDEER,
CONSTRAINT FK_TWEEDLEDEER_TWEEDLEDEER FOREIGN KEY (Mother) REFERENCES TWEEDLEDEER,
)
GO

CREATE TABLE POSITION(
PositionName    NVARCHAR(50),
Description     TEXT NOT NULL
CONSTRAINT position_pk PRIMARY KEY (PositionName)
)
GO

CREATE TABLE SHIP_ROSTER(
ShipRego_No     INT,
Tweedle_No      INT NOT NULL,
CommencementDate DATETIME NOT NULL,
Termination_Date DATETIME NOT NULL,
Medal           NVARCHAR(50) NOT NULL
CONSTRAINT ship_roster_pk PRIMARY KEY (ShipRego_No, Tweedle_No, CommencementDate)
)
GO

CREATE TABLE SPACESHIP(
ShipRego_No   INT NOT NULL,
ShipName      NVARCHAR(50) NOT NULL,
LightYearsTravelled   INT NOT NULL,
MaxWarpSpeed  INT NOT NULL
CONSTRAINT spaceship_fk PRIMARY KEY (ShipRego_No)
)
GO

CREATE TABLE MEDAL(
Medal    NVARCHAR(50) NOT NULL,
Value    MONEY NOT NULL
CONSTRAINT medal_pk PRIMARY KEY (Medal)
)
GO

CREATE TABLE RAID(
Raid_No      INT NOT NULL,
ShipRego_No  INT NOT NULL,
Planet_No    INT NOT NULL,
Date         DATETIME NOT NULL,
StartTime    DATETIME NOT NULL,
EndTime    DATETIME NOT NULL,
OppositionLevel NVARCHAR(50) NOT NULL
CONSTRAINT raid_pk PRIMARY KEY (Raid_No)
)
GO

CREATE TABLE PRISONER(
Prisoner_Id     INT NOT NULL,
FirstName       NVARCHAR(50) NOT NULL,
LastName        NVARCHAR(50) NOT NULL,
YearOfBirth     INT NOT NULL,
YearOfDeath     INT NOT NULL,
Raid_No         INT NOT NULL,
RansomPaid      MONEY NOT NULL,
Colour          NVARCHAR(50) NOT NULL
CONSTRAINT prisoner_pk PRIMARY KEY (Prisoner_Id)
)
GO

CREATE TABLE PLANET(
Planet_No   INT,
Name        NVARCHAR(50) NOT NULL,
DayLength   INT NOT NULL,
Atmospher   NVARCHAR(50) NOT NULL,
Technology  NVARCHAR(50) NOT NULL,
Star_No     INT NOT NULL
CONSTRAINT planet_pk PRIMARY KEY (Planet_No)
)
GO

CREATE TABLE STAR(
Star_No   INT,
Name      NVARCHAR(50) NOT NULL,
SpectralType      NVARCHAR(50) NOT NULL,
Position      NVARCHAR(50) NOT NULL
CONSTRAINT star_pk PRIMARY KEY (Star_No)
)
GO

我还试图用这个方法修改表

alter table TWEEDLEDEER 
add constraint FK_TWEEDLEDEER_SHIPROSTER
FOREIGN KEY(Tweedle_No) REFERENCES SHIP_ROSTER
46scxncf

46scxncf1#

SHIP_ROSTER 有3列作为主键,在引用中使用它时,您只使用一列,而外键中需要3列。
所以总的想法是,在表中 SHIP_ROSTER ,列 Tweedle_No 单独不是唯一的,您不能引用任何列中没有唯一值。
如果数据结构允许,那么可以对 SHIP_ROSTER table的 Tweedle_No 列,则外部约束将起作用

相关问题