【发布时间】: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 ID、Date、Category 创建多行。我唯一的其他选择是将我的值连接在同一行中,但如果我决定查找这些值,则可能会导致性能问题。
谁能帮我解决这个难题。我需要正确的结构来保存我的多个值并能够将其加载回 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查询。如果它是一个冲突的插入,那是一个错误,因为它们不应该能够多次更新?如果我读错了,则在第二个表上发布约束和更新。