表中的一列引用 SQL 中存在重复数据的另一列

Posted

技术标签:

【中文标题】表中的一列引用 SQL 中存在重复数据的另一列【英文标题】:One column in a table referring to another column where there are duplicate data in SQL 【发布时间】:2020-02-05 07:34:45 【问题描述】:

我想建立一个关于自行车(或自行车)租赁店的简单数据库系统。

下面是表格和括号中的列:

Model (MNr, Modelname, dayprice)

Bike (MNr, CopyNr, Frame, Color)

Customer (CNr, Name, Surename, MobileNr)

Rental (CNr, MNr, CopyNr, DateOut, DateIn)

(MNr代表型号,CNr代表客户编号)。

模型是自行车模型,自行车表显示每辆特定自行车的数据。

每个型号可以有几辆自行车,以区分它们 使用“CopyNr”列,其中给定型号中的每辆自行车编号为 1、2、3 等。

租赁:租赁关系始终只适用于一辆自行车和一位客户。

所以我放了以下主键和外键:

Model (MNr (PK), Modelname, dayprice)
Bike (MNr (FK), CopyNr (PK), Frame, Color)
Customer (CNr (PK), Firstame, Surname, MobileNr)
Rent (CNr (FK), MNr (FK), CopyNr (FK), DateOut, DateIn)

“Rental”中的“CopyNr”是指“Bikes”的“CopyNr”。所以我用“CopyNr”作为 主键列。

但是该列可以包含重复值,例如模型 A 的副本 nr 2 和模型 A 的副本 nr 2 模型 B。 并且主键列不允许重复值。

我在 SQL 文件中写了以下内容,但它在 phpMyAdmin 上。

这是来自 SQL 代码的代码:

[它有挪威名字,我把它改成了英文,所以颜色名字是挪威的]

-- phpMyAdmin SQL Dump
-- version 4.8.4
-- https://www.phpmyadmin.net/
--
-- Host: 127.0.0.1:3306
-- Generation Time: Feb 04, 2020 at 07:15 PM
-- Server version: 10.2.26-MariaDB-log
-- PHP Version: 7.1.30

SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
SET AUTOCOMMIT = 0;
START TRANSACTION;
SET time_zone = "+01:00";


/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8mb4 */;

--
-- 
--

-- --------------------------------------------------------

--
-- Table structure for table `Customer`
--

CREATE TABLE `Customer` (
  `CNr` int(2) NOT NULL,
  `Firstname` varchar(20),
  `Surname` varchar(20),
  `MobileNr` varchar(8),
  PRIMARY KEY (CNr)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;


INSERT INTO `Customer` (`CNr`, `Firstname`, `Surname`, `MobileNr`) VALUES
(1, 'Olav', 'Petterses', '88888888'),
(2, 'Petter', 'Olavsson', '44444444');

-- --------------------------------------------------------

--
-- Table structure for table `Model`
--

CREATE TABLE `Model` (
  `MNr` int(5) NOT NULL,
  `Modelname` varchar(20),
  `Dayprice` double DEFAULT NULL,
  PRIMARY KEY (MNr)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;


INSERT INTO `Model` (`MNr`, `Modelname`, `Dayprice`) VALUES
(2, 'FirstPrice', 10),
(15, 'DBS', 50),
(16, 'DBS', 60);

-- --------------------------------------------------------

--
-- Table structure for table `Bike`
--

CREATE TABLE `Bike` (
  `MNr` int(5),
  `CopyNr` int(2) NOT NULL,
  `Frame` int(3),
  `Color` varchar(10),
   PRIMARY KEY (`CopyNr`, `MNr`),
   CONSTRAINT `Bike_ibfk_1` FOREIGN KEY (`MNr`) REFERENCES `Model` (`MNr`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO `Bike` (`MNr`, `CopyNr`, `Frame`, `Color`) VALUES
(2, 1, 55, 'rød'),
(15, 1, 65, 'rød'),
(16, 1, 55, 'grønn'),
(2, 2, 55, 'rød'),
(15, 2, 65, 'grønn');


-- --------------------------------------------------------

--
-- Table structure for table `Rent`
--

CREATE TABLE `Rent` (
  `CNr` int(2),
  `MNr` int(5),
  `CopyNr` int(2),
  `DatoUt` date,
  `DateInn` date,
  CHECK (`DatoUt` < `DateInn`),
  CONSTRAINT `Rent_ibfk_1` FOREIGN KEY (`MNr`) REFERENCES `Model` (`MNr`),
  CONSTRAINT `Rent_ibfk_2` FOREIGN KEY (`CopyNr`) REFERENCES `Bike` (`CopyNr`),
  CONSTRAINT `Rent_ibfk_3` FOREIGN KEY (`CNr`) REFERENCES `Customer` (`CNr`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO `Rent` (`CNr`, `MNr`, `CopyNr`, `DatoUt`, `DateInn`) VALUES
(1, 15, 1, '2020-01-01', '2020-01-30'),
(2, 15, 2, '2020-02-15', '2020-02-29');


/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;

当我将它放在 PHPAdmin 上的 SQL 上并单击“GO”时,由于 CHECK (DatoIn > DateUt) 代码而出现错误。

然后我删除了那部分,然后我的“租金”表中没有值。

我做错了什么?

为什么我在 PHPMyAdmin 上的 SQL 上放置“Rent”表时没有值?

我应该重构表关系吗?

为什么“检查”不起作用? 我在使用 CHECK 时收到的错误消息:

【问题讨论】:

我因 CHECK 而出错 如果您遇到错误,请发布完整的消息。和原因声明 检查约束应该是CHECK (`DatoUt` &lt; `DateInn`),输入日期在过期日期之前没有任何意义。如果你做出改变,它会构建得很好dbfiddle.uk/… @Nick 我照你说的做了,又试了一次。但是“租金”表仍然没有值。它只有列(及其名称),但没有值。 你用的是什么版本的 mysql @Nick 服务器版本:10.2.26-MariaDB-log - MariaDB 服务器 【参考方案1】:

我相信您看到的语法警告是由于 phpMyAdmin 使用的解析器中的一个错误,该错误将该语法错误地标记为不正确。我认为这个错误已经被报告为https://github.com/phpmyadmin/sql-parser/issues/167。

正如 nick 所指出的,尽管有语法警告,您仍然可以使用该查询。

【讨论】:

【参考方案2】:

我认为退出日期应该小于进入日期 检查(DatoUtDateInn),

【讨论】:

以上是关于表中的一列引用 SQL 中存在重复数据的另一列的主要内容,如果未能解决你的问题,请参考以下文章

sql怎么把一个表的一列替换到对应的另一个表中对应的列?

SQL 从另一个表中的另一列更新一列

将行值转换为列,其值来自 spark scala 中的另一列 [重复]

SQL Server 2012 Express 如何从一列中提取信息并将其与具有表达式限制的另一列进行比较

如何使用另一个表中的另一列更新一列? SQL 错误:ORA-00933:SQL 命令未正确结束

熊猫:从数据透视表中的另一列中减去一列