gpt4 book ai didi

php - 如何选择插入行的多列主键?

转载 作者:行者123 更新时间:2023-11-29 00:07:08 25 4
gpt4 key购买 nike

问题:

我在 MySQL 中有下表。对于这个例子,假设世界上只有(而且永远都会)只有一个人叫“Tom”“Bell”。所以 (name, surname) 是我表中的 PRIMARY KEY。每个人都有自己的工资,一个无符号整数。

CREATE TABLE IF NOT EXISTS `user` (
`name` varchar(64) NOT NULL DEFAULT 'Default_name',
`surname` varchar(64) NOT NULL DEFAULT 'Default_surname',
`salary` int(10) unsigned NOT NULL DEFAULT '0',
UNIQUE KEY `id` (`name`,`surname`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

每当我使用 PHP 脚本插入一行时,我希望我的函数返回插入行的主键(数组键=>值)。

从 PHP 上下文我不知道表 'user' 的主键由什么组成,我并不总是需要设置所有主键值(示例 2,非常愚蠢,但可能)。

可以向我的插入函数添加另一个参数(例如,我可以传递表名,在本例中为“用户”)。

如果这很重要,我正在使用 PDO(php 数据对象)连接我的 MySQL 数据库。

示例 1:

$db->insert('INSERT INTO `user` (`name`,`surname`,`salary`) VALUES ('Tom','Bell','40');');

应该返回一个数组:

$arr = ['name' => 'Tom', 'surname' => 'Bell'];

例子2:

$db->insert('INSERT INTO `user` (`name`,`salary`) VALUES ('Nelly','40');');

应该返回一个数组:

$arr = ['name' => 'Nelly', 'surname' => 'Default_surname'];

免责声明和其他信息:

  1. 我知道这不是一个设计良好的表,我可以使用一个 auto_increment id 列来让它更容易,也可能更高效。这只是一个展示问题的示例,无需解释我的项目结构。

  2. 不失一般性:使用像“getLastInsertId()”或“@@identity”这样的函数将返回 0,我猜这是因为表没有 auto_increment 列。

    <
  3. 我尝试了什么?什么都没有(除了第 2 点中所述的事情(我确信它不会起作用)和寻找解决方案)。

最佳答案

没有解决此问题的“好”方法。使用 auto_increment 的原因之一是避免出现您描述的问题。

现在,为了避免我的回答成为只考虑一半情况的答案之一 - 我确实意识到有时您继承了一个项目,或者您只是在初始阶段搞砸了,您必须快速修复问题。

反射(reflection)您的示例 - 您的 PK 是自然 PK,而不是像 auto_increment 那样的替代 PK。由于这个事实,这意味着您始终知道 PK。

在您的示例 #1 中 - 您插入了 Tom Bell - 这意味着您知道 PK 是 Tom Bell 因为您指示 MySQL 插入它。因此,由于您甚至在插入之前就知道 PK 是什么,所以您知道如何返回它。

在您的示例 #2 中,您仅指定了 PK 的一部分。但是,您的表定义表明 name 和 surname 的默认值为 Default_surname。这意味着,如果您省略 PK 的任何一部分,您就会知道它将采用默认值。这也意味着您在插入之前就已经知道 PK 是什么。

由于您必须使用自然 PK 而不是代理项,因此“了解”它的责任转移到您而不是 RDBMS。 没有其他方法可以执行此操作。如果允许默认值变为 null,问题会变得更加复杂。这将允许您插入超过 1 个以 null 作为姓氏的 Tom,并且索引约束不适用(null 不等于 null,因此 (tom, null)不等于 (tom, null) 并且插入可以继续。

长话短说,您需要代理 PK 或 auto_increment。它会根据描述完成您需要的一切。如果您不能使用它,那么您手上就有一个可能无法解决的大问题。

关于php - 如何选择插入行的多列主键?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27013892/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com