【发布时间】:2012-01-27 05:53:40
【问题描述】:
我有一个 mySQL 数据库,我有一个 Perl 脚本连接到它并执行一些数据操作。 数据库中的一张表如下所示:
CREATE TABLE `mydb`.`companies` (
`company_id` INT NOT NULL AUTO_INCREMENT,
`company_name` VARCHAR(100) NULL ,
PRIMARY KEY (`company_id`) );
我想在这个表中插入一些数据。问题是数据中有些公司可以重复。
问题是:如何检查“company_name”是否已经存在?如果存在,我需要检索“company_id”并使用它将数据插入另一个表。如果没有,则应在此表中输入此信息,但我已经有此代码。
这里有一些额外的要求:脚本可以同时运行多次,所以我不能只是将数据读入哈希并检查它是否已经存在。
我可以抛出一个额外的“SELECT”查询,但它会在 DB 上产生额外的命中。
我试图寻找答案,但这里的每个问题或网络上的线程都在谈论使用主键检查。我不需要这个。数据库结构已经设置,但如果需要,我可以进行更改。该表将用作附加表。
还有其他方法吗?在 DB 和 Perl 中。
【问题讨论】:
-
公司名称应该是主键的一部分,这样就没有问题了。
-
好点,马特。我在答案中将其添加为选项 2。
-
@Mat: "company_id" 是另一个表中的外键。如果我使用 2 个字段创建主键,则不需要该表。但是它会破坏数据库规范化。我知道这不是教条,但作为一名优秀的开发人员,我想遵循这些规则。还有其他想法吗?谢谢。
-
如果我们看到您的确切工作流程会有所帮助。从您的问题和您的一些 cmets 中,您并不清楚您需要改进的确切位置,只是您担心一个额外的 SELECT。 (你只需要
$dbh->{mysql_insertid}吗?) -
@pilcrow 好的,我有另一个名为投资的表,其结构为:CREATE TABLE investment(investment_id INT NOT NULL AUTO_INCREMENT, company_id INT,investor_id INT, ....);投资表有一个外键“company_id”。我需要的是在“公司”表中插入具有唯一名称的数据,以便“投资”表可以具有适当的外键值。我正在尝试查看是否有一个简单的解决方案,而不需要过多地访问数据库。