【问题标题】:Proper way to prevent duplicate entries using MySQL or PHP使用 MySQL 或 PHP 防止重复条目的正确方法
【发布时间】:2014-10-24 15:36:02
【问题描述】:

我有 song 表,其中有 songCategorysongName 列。 songCategorysongName 的组合在数据库级别设置为唯一。所以基本上即使php尝试插入重复的条目数据库也不会允许。

问题是,项目具有用户可以一次插入一堆歌曲的功能。如您所知,大数据的重复记录检查需要很长时间:对于每首歌曲,我必须查询是否有带有categoryID=xsongName=y的歌曲。所以我需要你的建议来解决这个问题,而不需要额外的重复检查。

我对此没有什么想法,但我不太确定它们是否会起作用:

  • 无论如何我们都可以插入记录,如果出现数据库错误,我们只需continueforeach循环即可。
  • 我们可以在每次插入后触发数据库中的一些函数来检查和删除重复的行(我没有自定义mysql函数的经验)

顺便说一句,我正在使用带有 MySQL 数据库的 Yii 框架。

你的建议?

【问题讨论】:

  • insert 不管怎样,你可以检查插入的计数,它会告诉你这首歌是否是重复的。 mysql_affected_rows() 或等效项将告诉您是否实际插入了原始数据或被拒绝,因为它是重复的
  • 使用UNIQUE 属性创建一个名为md5_name 的字段,添加歌曲时:md5_name = md5($song_cat . $song_name) 并添加歌曲并捕获任何Exception 或检查last_inserted_id
  • 如果你使用的是原生 sql 你可以试试insert ignore 但我不认为 yii 的活动记录支持它

标签: php mysql sql database yii


【解决方案1】:

您可以使用临时表。让 php 应用程序将所有内容插入到临时表中,然后调用具有这种逻辑的查询。

insert into mainTable 
(field1, field2, etc)
select field1, field2, etc
from tempTable 
where (subquery to check for existing records goes here)

或者你可以使用 try/catch。我不知道 php 语法,但由于许多其他语言可以做这种事情,我希望 php 也能做到。

try
code to insert record
catch
if the error code is the one for duplicate records, do nothing.
if it's something else, handle it accordingly.

【讨论】:

    【解决方案2】:

    我会使用 REPLACE INTO 而不是 INSERT INTO

    这样,如果它已经存在,它将被覆盖。

    免责声明:请谨慎使用。您不希望一个人的歌曲覆盖另一个人的歌曲。

    Link to REPLACE INTO on stackoverflow

    【讨论】:

      【解决方案3】:

      为什么不能使用 INSERT IGNORE 构造?

      【讨论】:

        【解决方案4】:

        您可以在您的 Yii 模型中通过创建自定义验证规则来处理此问题。

        public function rules()
        {
            return array(
               array('song_name', 'checkUniqueSongInCat','on'=>'insert'),  //check only on insert 
            );
        }
        
        public function checkUniqueSongInCat($attribute, $params)
        {
           if (my_check_for_unique_song() === false)
           {
              $this->addError('song_name','Song is not unique');  
           }
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-08-29
          • 1970-01-01
          • 2015-02-13
          • 1970-01-01
          • 2019-12-04
          • 1970-01-01
          相关资源
          最近更新 更多