Php 如何选择插入行的多列主键? 问题:

Php 如何选择插入行的多列主键? 问题:,php,mysql,sql,Php,Mysql,Sql,我在MySQL中有下表。 在这个例子中,让我们假设世界上只有一个人叫汤姆·贝尔,而且永远只有一个人。所以名称、姓氏是我表中的主键。每个人都有自己的薪水,一个无符号整数 CREATE TABLE IF NOT EXISTS `user` ( `name` varchar(64) NOT NULL DEFAULT 'Default_name', `surname` varchar(64) NOT NULL DEFAULT 'Default_surname', `salary` int(1

我在MySQL中有下表。 在这个例子中,让我们假设世界上只有一个人叫汤姆·贝尔,而且永远只有一个人。所以名称、姓氏是我表中的主键。每个人都有自己的薪水,一个无符号整数

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脚本插入一行时,我希望我的函数返回插入行的主键array key=>value

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

我可以向insert函数添加另一个参数,例如,我可以传递表名,在本例中为user

如果这很重要,我将使用PDO php数据对象连接MySQL数据库

例1: 应返回一个数组:

$arr = ['name' => 'Tom', 'surname' => 'Bell'];
$arr = ['name' => 'Nelly', 'surname' => 'Default_surname'];
例2: 应返回一个数组:

$arr = ['name' => 'Tom', 'surname' => 'Bell'];
$arr = ['name' => 'Nelly', 'surname' => 'Default_surname'];
免责声明和其他信息:
我知道这不是一个设计良好的表,我可以使用auto_increment id列使它更简单,也可能更高效。这只是一个例子来说明问题,而不必解释我的项目结构

在不丧失通用性的情况下:使用诸如getLastInsertId或@identity之类的函数将返回0,我想原因是该表没有自动增量列

我试过什么?除了第2点中所述的事情,我确信它不会起作用,并且正在寻找解决方案


解决这个问题没有好办法。使用自动增量的原因之一是避免出现如您所述的问题

现在,为了避免我的回答只考虑了一半的情况,我确实意识到有时候你继承了一个项目,或者你只是在初始阶段搞砸了,你必须迅速解决问题

反思一下你的例子——你的PK是一个自然的PK,而不是像auto_increment那样的代理PK。由于这个事实,这意味着你总是知道PK

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

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

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


长话短说,您需要一个代理PK或自动增量。它可以根据描述完成您需要的所有操作。如果你不能使用它,那么你就面临着一个可能无法解决的巨大问题。

你有没有任何实际或有效的理由尽你所能让你的代码和生活变得悲惨,从而扼杀性能和可用性?我只是想知道为什么有人会这么做,因为你知道它会带来很多陷阱。不必解释我的项目结构可能意味着我已经有了一些天才计划。好我正在编写一个使用PDO的数据库/查询类。然而,PDO有一些恼人的事情,比如不能绑定一个安全的字符串:数组语句它确实保护了它,但它不会像一些人所期望的那样工作。我正试图自己解决类似的问题,当然总体来说效率会降低。以数组形式返回主键的insert查询将是一件很棒的事情,但是没有它一切都可以解决。我想指出的一点是:如果列属于主键,它不能包含“null”。即使您在创建数据库时跳过NOTNULL约束,主键也会自动将其所有列设置为NOTNULL。您的PK是正确的,我的错误是忽略了它。但是,相同的规则不适用于唯一的。我必须承认,我几乎从未处理过复合PKs,但感谢您的更正。希望这些信息将来能帮助其他人: