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

时间:2014-11-19 10:00:24

标签: php mysql sql

问题:

我在MySQL中有下表。 对于这个例子,我们可以说世界上只有一个人叫做#34; Tom" "贝尔&#34 ;.所以(姓名,姓氏)是我表中的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上下文我不知道表'用户'的主键是什么?包含并且我并不总是需要设置所有主键值(例2,非常愚蠢,但可能)。

可以在我的插入函数中添加另一个参数(例如,我可以传递表名,在本例中为#34; user")。

如果这很重要,我正在使用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点所说的内容(我确信它不会起作用)并寻找解决方案)。

1 个答案:

答案 0 :(得分:1)

这个问题没有“好”的方法。有一个auto_increment的原因之一是避免出现像你描述的问题。

现在,为了避免我的答案成为仅考虑一半图片的那一个 - 我确实意识到有时你继承了一个项目,或者你只是在初始阶段搞砸了,你必须快速解决问题。

反思你的例子 - 你的PK是一个自然的PK,而不是像auto_increment那样的代理。由于事实,暗示你总是知道PK。

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

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

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

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