You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

我的MySQL城市自行车租赁系统创建脚本为何报错?

城市自行车租赁数据库脚本错误排查与修正

问题背景

原本需和小组完成作业,组员未参与,独自完成逻辑部分,现需在MySQL Workbench中实现挪威语命名的城市自行车租赁系统数据库,但编写的脚本执行时首段代码就报错,请求协助排查问题并修正。

任务要求

某运营城市自行车租赁系统的公司需数据库管理租赁业务,要求如下:

  • 创建指定表结构的数据库,自行选择合适数据类型
  • 仅要求Utleie(租赁)表的Utlevert(借出)和Innlevert(归还)字段为Timestamp类型
  • 创建表后插入测试数据

原错误脚本

建表语句

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);

错误排查与修正点

  1. 外键依赖顺序错误:创建Sykkel表时引用了Lås表,但Lås表在原脚本中是后续才创建的,MySQL要求被引用的父表必须先于子表创建。需调整建表顺序,先创建Sykkelstativ、Lås,再创建Sykkel。
  2. 缺失关联外键:Lås表的StativID应该关联到Sykkelstativ的StativID,否则无法保证锁具所属站点的合法性,需添加该外键。
  3. 外键字段可空性问题:Sykkel表中的StativID和Låsnr作为外键字段,允许为空会导致外键约束失效(空值不触发外键检查),建议设置为NOT NULL以保证数据完整性。
  4. 插入数据不完整:插入Sykkel数据时未提供StativID和Låsnr的值,导致这些字段为空,不符合实际业务逻辑,需补充对应有效值。

修正后的完整脚本

建表语句

CREATE DATABASE IF NOT EXISTS bysykkel;

USE bysykkel;

-- 先创建站点表,作为锁具表的父表
CREATE TABLE Sykkelstativ (
  StativID INT PRIMARY KEY,
  Sted VARCHAR(255) NOT NULL
);

-- 创建锁具表,关联站点表
CREATE TABLE Lås (
  StativID INT NOT NULL,
  Låsnr INT NOT NULL,
  PRIMARY KEY (StativID, Låsnr),
  FOREIGN KEY (StativID) REFERENCES Sykkelstativ(StativID)
);

-- 创建自行车表,关联锁具表
CREATE TABLE Sykkel (
  SykkelID INT PRIMARY KEY,
  Startdato DATE NOT NULL,
  StativID INT NOT NULL,
  Låsnr INT NOT NULL,
  FOREIGN KEY (StativID, Låsnr) REFERENCES Lås(StativID, Låsnr)
);

-- 创建客户表
CREATE TABLE Kunde (
  Mobilnr VARCHAR(8) PRIMARY KEY,
  Fornavn VARCHAR(255) NOT NULL,
  Etternavn VARCHAR(255) NOT NULL,
  Betalingskortnr VARCHAR(16)
);

-- 创建租赁表
CREATE TABLE Utleie (
  SykkelID INT NOT NULL,
  Utlevert TIMESTAMP NOT NULL,
  Mobilnr VARCHAR(8) NOT NULL,
  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 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);

-- 插入自行车数据,补充StativID和Låsnr
INSERT INTO Sykkel (SykkelID, Startdato, StativID, Låsnr) VALUES
  (1, '2020-01-01', 1, 1),
  (2, '2020-02-01', 1, 2),
  (3, '2020-03-01', 2, 1),
  (4, '2020-04-01', 2, 2),
  (5, '2020-05-01', 3, 1);

-- 插入客户数据
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);

内容的提问来源于stack exchange,提问作者ChiefFenix

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 19:54:53