表中的一列引用 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` < `DateInn`)
,输入日期在过期日期之前没有任何意义。如果你做出改变,它会构建得很好dbfiddle.uk/…
@Nick 我照你说的做了,又试了一次。但是“租金”表仍然没有值。它只有列(及其名称),但没有值。
你用的是什么版本的 mysql?
@Nick 服务器版本:10.2.26-MariaDB-log - MariaDB 服务器
【参考方案1】:
我相信您看到的语法警告是由于 phpMyAdmin 使用的解析器中的一个错误,该错误将该语法错误地标记为不正确。我认为这个错误已经被报告为https://github.com/phpmyadmin/sql-parser/issues/167。
正如 nick 所指出的,尽管有语法警告,您仍然可以使用该查询。
【讨论】:
【参考方案2】:我认为退出日期应该小于进入日期
检查(DatoUt
DateInn),
【讨论】:
以上是关于表中的一列引用 SQL 中存在重复数据的另一列的主要内容,如果未能解决你的问题,请参考以下文章
将行值转换为列,其值来自 spark scala 中的另一列 [重复]
SQL Server 2012 Express 如何从一列中提取信息并将其与具有表达式限制的另一列进行比较