【发布时间】:2015-01-16 19:07:37
【问题描述】:
问题:
我在 MySQL 中有下表。 对于这个例子,假设世界上只有一个人(并且永远会有)叫“Tom”“Bell”。所以 (name, surname) 是我表中的主键。每个人都有他的薪水,一个无符号整数。
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'];
免责声明和其他信息:
我知道这不是一个精心设计的表,我可以使用 auto_increment id 列来使它更容易,也可能更有效。这只是一个展示问题的示例,无需解释我的项目结构。
-
不失一般性:使用诸如“getLastInsertId()”或“@@identity”之类的函数将返回0,我猜原因是因为表没有auto_increment 列。
李> 我尝试了什么?什么都没有(除了第 2 点中所述的事情(我确信它不会起作用)并正在寻找解决方案)。
【问题讨论】:
-
是否有任何实际或正当的理由为什么你会竭尽全力让你的代码和生活变得悲惨以扼杀性能和可用性?我只是想知道为什么有人会这样做,因为您知道随之而来的许多陷阱。
-
“无需解释我的项目结构”可能暗示我已经有了一些天才计划。好吧.. 我只是在编写一个使用 PDO 的数据库/查询类。然而 PDO 有一些烦人的事情,比如无法使用安全字符串来绑定“IN(:array)”语句(它确实保护了它,但它不会像某些人期望的那样工作)。我正在尝试自己解决类似的问题(当然整体效率会降低)。以数组形式返回主键的插入查询将是一件很棒的事情,但如果没有它,一切都可以解决。