mysql 为什么我使用的SQL代码不工作?[重复]

cetgtptt  于 2023-03-28  发布在  Mysql
关注(0)|答案(1)|浏览(71)

此问题在此处已有答案

MySQL Creating tables with Foreign Keys giving errno: 150(20个答案)
昨天关门了。
我有家庭作业,我和我的小组一起做,但我的小组不会做,所以我不得不自己做所有的事情。我已经在第一个代码上卡住了。我在技术上完成了家庭作业,但刚刚把它应用到我的SQL Workbench。我需要帮助。任务实际上是挪威语,所以我只是谷歌翻译了所有的东西,黑暗中的那个是我们要用的采石场,也是挪威语的。任务是这样的:
运营城市自行车计划的公司在数据库中使用以下表结构来管理城市自行车的租赁:
将复合外键从Bicycle标记为Lock。城市自行车方案最初包括3,000辆可用自行车、300个自行车架和6,000个电子锁(每个自行车架约20个)。要使用By-cycle方案,客户必须注册订阅,并输入您移动的号码、姓名和支付卡。
自行车租赁是通过移动的上的应用程序完成的,当客户站在自行车旁边时,自行车被放置在自行车架的锁中,并释放/解锁自行车。交付和提交表中的租赁是时间戳上的自行车时,自行车被取出/放入锁在自行车机架。注意自行车被放置/锁定(自行车插入锁时,自行车中的Stand ID和Lock number会自动获取值),自行车出租时(从锁中取出)在自行车空标记中获得支架ID和锁编号。自行车在“城市”自行车方案中投入使用时自行车保持器订单中的开始日期。您当前付款直到将自行车固定在自行车架上的锁中。租赁期结束时,将自行车锁上,客户在应用程序中收到自行车交付的确认。租赁金额将从支付卡中扣除并登记。自行车计划的实施者希望了解自行车在城市中投入使用的时间 自行车,自行车被锁在哪里,哪些自行车被租用,谁租用自行车,订户,哪些房东已经终止等......
第1部分a)创建一个脚本,用于创建具有给定表结构的数据库,自己选择合适的数据类型。对数据类型的唯一要求是Rental表中发布和返回的时间戳。在创建数据库的脚本之后,该脚本应包含插入良好的测试数据,以在采石场提供良好的结果。
我的一个朋友帮了我,所以这是我们使用的代码,但我一直在第一个代码中出错,我相信我会在其他代码中出错。

CREATE DATABASE bysykkel;

USE bysykkel;

CREATE TABLE Sykkel (
  SykkelID INT PRIMARY KEY,
  Startdato DATE,
  StativID INT,
  Låsnr INT,
  FOREIGN KEY (StativID, Låsnr) REFERENCES Lås (StativID, Låsnr)
);

CREATE TABLE Sykkelstativ (
  StativID INT PRIMARY KEY,
  Sted VARCHAR(255)
);

CREATE TABLE Lås (
  StativID INT,
  Låsnr INT,
  PRIMARY KEY (StativID, Låsnr)
);

CREATE TABLE Kunde (
  Mobilnr VARCHAR(8) PRIMARY KEY,
  Fornavn VARCHAR(255),
  Etternavn VARCHAR(255),
  Betalingskortnr VARCHAR(16)
);

CREATE TABLE Utleie (
  SykkelID INT,
  Utlevert TIMESTAMP,
  Mobilnr VARCHAR(8),
  Innlevert TIMESTAMP,
  Beløp DECIMAL(10, 2),
  PRIMARY KEY (SykkelID, Utlevert),
  FOREIGN KEY (SykkelID) REFERENCES Sykkel (SykkelID),
  FOREIGN KEY (Mobilnr) REFERENCES Kunde (Mobilnr)
);
INSERT INTO Sykkel (SykkelID, Startdato) VALUES
  (1, '2020-01-01'),
  (2, '2020-02-01'),
  (3, '2020-03-01'),
  (4, '2020-04-01'),
  (5, '2020-05-01');

INSERT INTO Sykkelstativ (StativID, Sted) VALUES
  (1, 'Sentrum'),
  (2, 'Grünerløkka'),
  (3, 'Majorstuen');

INSERT INTO Lås (StativID, Låsnr) VALUES
  (1, 1),
  (1, 2),
  (1, 3),
  (2, 1),
  (2, 2),
  (2, 3),
  (3, 1),
  (3, 2),
  (3, 3);

INSERT INTO Kunde (Mobilnr, Fornavn, Etternavn, Betalingskortnr) VALUES
  ('11111111', 'Ola', 'Nordmann', '1111222233334444'),
  ('22222222', 'Kari', 'Nordmann', '2222333344445555'),
  ('33333333', 'Per', 'Hansen', '3333444455556666');

INSERT INTO Utleie (SykkelID, Utlevert, Mobilnr, Innlevert, Beløp) VALUES
  (1, '2022-03-25 10:00:00', '11111111', '2022-03-25 11:00:00', 10.00),
  (2, '2022-03-25 10:30:00', '11111111', NULL, NULL),
  (3, '2022-03-25 11:00:00', '22222222', NULL, NULL),
  (4, '2022-03-25 11:30:00', '33333333', NULL, NULL);
dzjeubhm

dzjeubhm1#

我猜错误是:
错误1824:无法打开引用的表“Lås”。
这只是一个创建表语法执行顺序的问题。表Sykkel的第一个创建表语法包括REFERENCES Lås (StativID, Låsnr),而引用的表Lås尚未创建,如何创建其他表来引用它?这意味着解决方案相当简单,只需移动CREATE TABLE的顺序,并将Lås作为在数据库之后或需要引用表的任何表创建之前创建的第一个。因此:

CREATE DATABASE bysykkel;

USE bysykkel;

CREATE TABLE Lås ( 
   StativID INT, 
   Låsnr INT, 
   PRIMARY KEY (StativID, Låsnr) 
);

CREATE TABLE Sykkel ( 
   SykkelID INT PRIMARY KEY, 
   Startdato DATE, 
   StativID INT, 
   Låsnr INT, 
   FOREIGN KEY (StativID, Låsnr) 
   REFERENCES Lås (StativID, Låsnr) 
);

....

Demo fiddle

相关问题