【问题标题】:Insert Multivalue, MYSQL DB Structure插入多值,MYSQL 数据库结构
【发布时间】:2018-12-05 16:26:20
【问题描述】:

以下代码是我为描述我的情况而编写的示例。

我有 3 个带有多个选项的 html 'Selects'。每天,用户必须为每个“选择”选择至少一个选项。

<html>
<head></head>
<body>
<form id="frm" action="Save.php" method="POST">
<input type="text" id="datepicker" name="datepicker" readonly='true'>
<select id="OptionType1" multiple="multiple">
<option value="1">Option 1</option>
<option value="2">Option 2</option>
<option value="3">Option 3</option>
</select>
<select id="OptionType2" multiple="multiple">
<option value="1">Option 1</option>
<option value="2">Option 2</option>
<option value="3">Option 3</option>
</select>
<select id="OptionType3" multiple="multiple">
<option value="1">Option 1</option>
<option value="2">Option 2</option>
<option value="3">Option 3</option>
</select>
</form>
</body></html>

CREATE TABLE `m` (
`ID` int(11) NOT NULL AUTO_INCREMENT,
`Client ID` int(11) DEFAULT '0',
`Date` date DEFAULT NULL,
`Category` int(11) DEFAULT '0' COMMENT 'categoryA-1,categoryB-2,categoryC-3',
`OptionsType1` int(11) DEFAULT '0',
`OptionsType2` int(11) DEFAULT '0',
`OptionsType3` int(11) DEFAULT '0',
PRIMARY KEY (`ID`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

此数据库结构每个只能采用一个 OptionType 值。

Client ID,Date,Category 用于制作唯一索引。唯一索引用于“Insert Into... ON Duplicate Key Update”。我使用唯一索引的原因是用户可以返回并编辑他们的选项,mysql 将根据唯一索引对其进行更新。

由于唯一索引,我无法使用相同的Client IDDateCategory 创建多行。我唯一的其他选择是将我的值连接在同一行中,但如果我决定查找这些值,则可能会导致性能问题。

谁能帮我解决这个难题。我需要正确的结构来保存我的多个值并能够将其加载回 html 并让用户能够更新它。谢谢

更新: 创建了两个表

CREATE TABLE `m` (
`ID` int(11) NOT NULL AUTO_INCREMENT,
`Client ID` int(11) DEFAULT '0',
`Date` date DEFAULT NULL,
`Category` int(11) DEFAULT '0' COMMENT 'categoryA-1,categoryB-2,categoryC-3',
PRIMARY KEY (`ID`),
UNIQUE KEY `uniq` (`Client ID`,`Date`,`Category`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

CREATE TABLE `c` (
`ID` int(11) NOT NULL AUTO_INCREMENT,
`OptionsType1` int(11) DEFAULT '0',
`OptionsType2` int(11) DEFAULT '0',
`OptionsType3` int(11) DEFAULT '0',
`REF ID` int(11) DEFAULT '0',
PRIMARY KEY (`ID`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

有没有办法在不删除的情况下替换现有数据(c表)。唯一索引不存在于 c 表仅主键上,但我在加载 html 表单时不跟踪它。

【问题讨论】:

  • 日期栏在那里,你能改写你的问题吗?我不明白。谢谢
  • 我看错了。没有OptionType 列。使用 2 个表并拥有 OptionType 和另一个表中的值,其 id 映射回 m 表。
  • ID,Client ID,Date,Category分隔m表,用Primarykey ID,OptionsType1,OptionsType2,@9876543439@,@98765分隔c表并加入 m.IDon c.Reference ID?似乎是个好主意
  • 我认为这将解决我的数据库问题。但我认为这可能会让我对“重复密钥更新时插入”感到头疼
  • 此时您不需要insert/update 查询。如果它是一个冲突的插入,那是一个错误,因为它们不应该能够多次更新?如果我读错了,则在第二个表上发布约束和更新。

标签: php html mysql database


【解决方案1】:

如果您不想连接,可以为值创建一个新表并引用 m 表。

对于m 表,您可以将 OptionsType[1-3] 字段替换为一列,其中保留了 OptionsType 的编号,并将此新列添加到共享唯一键中。

在值表中,您引用 m 表的 id 并在其中放置选项编号和用户选择。


为了详细说明解决方案,在引用表被接受并调整问题后:

首先我展示了表的创建,然后我解释它。

表 m

CREATE TABLE `m` ( `ID` INT(11) NOT NULL AUTO_INCREMENT, `Client ID` INT(11) NOT NULL, `Date` DATE NOT NULL, `Category` INT(11) NOT NULL COMMENT 'categoryA-1,categoryB-2,categoryC-3', `OptionsType` INT(11) NOT NULL, PRIMARY KEY (`ID`), UNIQUE INDEX `Client ID_Date_Category_OptionsType` (`Client ID`, `Date`, `Category`, `OptionsType`) ) ENGINE=InnoDB;

表 c

CREATE TABLE `c` ( `ID` INT(11) NOT NULL AUTO_INCREMENT, `mID` INT(11) NOT NULL, `Option` INT(11) NOT NULL, `Value` INT(11) NOT NULL, PRIMARY KEY (`ID`), UNIQUE INDEX `mID_Option` (`mID`, `Option`), INDEX `mID` (`mID`) ) ENGINE=InnoDB;

说明

OptionsType 添加到表m。在表 c 中,您通过 m.ID=c.mID 引用表 m。为确保不保留重复项,在mIDOption 上设置了唯一索引。Option 列显示引用了哪个选项,value 显示用户的选择。使用此架构,您也不仅限于每次选择三个选项。

查询示例

SELECT * FROM `m` INNER JOIN `c` ON `m`.`ID`=`c`.`mID`; +----+-----------+------------+----------+-------------+----+-----+--------+-------+ | ID | Client ID | Date | Category | OptionsType | ID | mID | Option | Value | +----+-----------+------------+----------+-------------+----+-----+--------+-------+ | 1 | 4711 | 2018-06-27 | 1 | 1 | 1 | 1 | 1 | 0 | | 1 | 4711 | 2018-06-27 | 1 | 1 | 2 | 1 | 2 | 1 | | 1 | 4711 | 2018-06-27 | 1 | 1 | 3 | 1 | 3 | 0 | | 3 | 4711 | 2018-06-27 | 1 | 2 | 7 | 3 | 1 | 0 | | 3 | 4711 | 2018-06-27 | 1 | 2 | 8 | 3 | 2 | 1 | | 3 | 4711 | 2018-06-27 | 1 | 2 | 9 | 3 | 3 | 0 | +----+-----------+------------+----------+-------------+----+-----+--------+-------+ 6 rows in set (0.00 sec)

【讨论】:

  • 感谢 user3783243 还提到这听起来与我的数据库的正确结构有关,但它可能会导致我的插入更新查询出现问题
  • 我编辑了我的答案以更详细地介绍。这应该使架构问题清晰。至于插入和更新查询,您可能需要先检查条目是否已存在。但这是另一个问题。
  • 感谢您的更新,非常感谢您抽出宝贵时间帮助我解决此问题。您能解释一下选项列的用​​途吗?如果选项列具有“1”,则不能用于确定选择了第一个选项,因为选项的顺序可以更改。值列用于保存选项的值,并使用它将保存的数据加载回表单。那么当我可以有多个值链接到 UNIQUE INDEX Client ID_Date_Category_OptionsType 时,是否有必要拥有 UNIQUE INDEX mID_Option
  • 我相信我已经弄清楚了插入、更新和删除数据。完成后,我将发布我的方法。我将主要使用您提供的架构谢谢
  • 我看到了混乱。正如我现在所看到的,命名可以改进。解释一下:option 表示 HTML 选项值,value 表示用户是否选择了该选项。
猜你喜欢
  • 1970-01-01
  • 2014-05-18
  • 1970-01-01
  • 2018-09-27
  • 1970-01-01
  • 1970-01-01
  • 2018-01-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多