php - 插入多值,MYSQL 数据库结构

标签 php html mysql database

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

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

<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 表单时不跟踪它。

最佳答案

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

对于 m 表,您可以用一列替换 OptionsType[1-3] 字段,其中 OptionsType 的编号是持久的,并将这个新列添加到共享唯一键。

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


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

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

表格m

创建表 `m` ( `ID` INT(11) NOT NULL AUTO_INCREMENT, `客户端 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, 主键(`ID`), UNIQUE INDEX `Client ID_Date_Category_OptionsType` (`Client ID`, `Date`, `Category`, `OptionsType`) ) 引擎 = InnoDB;

表c

创建表 `c` ( `ID` INT(11) NOT NULL AUTO_INCREMENT, `mID` INT(11) 不为空, `Option` INT(11) NOT NULL, `Value` INT(11) NOT NULL, 主键(`ID`), UNIQUE INDEX `mID_Option` (`mID`, `Option`), 索引`mID` (`mID`) ) 引擎 = InnoDB;

解释

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

示例查询

SELECT * FROM `m` INNER JOIN `c` ON `m`.`ID`=`c`.`mID`; +----+------------+------------+--------+-------- -----+----+-----+--------+------+ |编号 |客户端编号 |日期 |类别 |选项类型 |编号 |中间ID |选项 |值(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 行(0.00 秒)

关于php - 插入多值,MYSQL 数据库结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51051524/

相关文章:

php - 意外关机后控制

javascript - 为什么我的 HTML 表单会被提交?

mysql - 如何使用 odbc for filemaker 将数据从 filemaker pro 移动到 microsoft sql server studio

MySQL - 选择值并按表名删除重复项

java - 未提交的数据库事务和自增列

php - 如何通过 codeigniter 日历库在当前月份的空单元格中填充上个月和下个月的日期

php - Laravel 返回response()->json() 而不是只返回一个数组

php - 自动转换百分比输入值

java - 在 glassfish 3.1.2 中将图像添加到表单例份验证

javascript - 浏览器在动态添加的基本 html 标记后加载 Assets 两次