【问题标题】:Laravel: SQL LEFT JOIN with an INSERT (FOREIGN KEYS)Laravel:带有 INSERT(外键)的 SQL LEFT JOIN
【发布时间】:2019-01-24 06:59:50
【问题描述】:

我想用 users 表中的 user_id 和 reps 表中他们没有使用代表的随机 rep_id 填充一个新表,否则他们希望分配他们拥有的代表的 rep_id用过的。我为 user_id 和 rep_id 设置了外键,两者都可以为空,但 user_id 也是主键。

我可以做这样的事情来选择user_idrep_id 修补程序没有问题...

$active_rep_array = DB::table('reps')
            ->where('active',1)
            ->pluck('id');

$array_length = count($active_rep_array);

$active_reps = '\'' . implode('\',\'', $active_rep_array->all()) . '\'';

$users = DB::select("
                SELECT users.id AS user_id, 
                COALESCE(rs.rep_id,elt(floor(rand() * $array_length + 1), $active_reps ),0) AS rep_id 
                FROM users 
                LEFT JOIN rep_sessions rs ON users.id=rs.user_id");

但我想同时将此数据插入到新创建的表中。到目前为止我有这个(而不是$users 查询)......

DB::insert("
            INSERT INTO user_registration_meta (user_id,rep_id) 
            SELECT users.id AS user_id, 
            COALESCE(rs.rep_id,elt(floor(rand() * $array_length + 1), $active_reps ),0) AS rep_id 
            FROM users 
            LEFT JOIN rep_sessions rs ON users.id=rs.user_id");

这在修补程序中给了我这个错误......

Illuminate/Database/QueryException with message 'SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '9952085' for key 'PRIMARY'

这是user_registration_meta 表...

+---------+------------------+------+-----+---------+-------+
| Field   | Type             | Null | Key | Default | Extra |
+---------+------------------+------+-----+---------+-------+
| user_id | int(10) unsigned | NO   | PRI | NULL    |       |
| rep_id  | int(10) unsigned | YES  | MUL | NULL    |       |
+---------+------------------+------+-----+---------+-------+

我在mysql和ALTER TABLE user_registration_meta AUTO_INCREMENT = 1;中截断了

任何想法为什么会出现这个错误?

【问题讨论】:

  • 那么,您只希望一个用户存在一行?您正在使用rep_sessions 表来检查他们以前是否使用过代表?如果没有,你只是添加一个随机的?
  • 没错。一个用户可以有多个会话,但我们只是在寻找一个 rep_id。啊,这可能是问题所在!
  • 你迷路了,当你说用户可以拥有多个会话时,这是否意味着他们可以user_registration_meta 表中拥有不止一行,或者您只是指rep_sessions 表吗?
  • 对不起。您在原始评论中的想法是正确的。 rep_sessions 表中每个用户可以有不止一行,但 user_registration_meta 表中每个用户只能有一行。我想你已经解决了这个问题。如果您想将其作为答案,我会接受。谢谢。
  • 我很高兴能帮上忙,但老实说,我不确定答案是什么 :)

标签: php mysql sql laravel foreign-keys


【解决方案1】:

万一其他人偶然发现了这一点,它对任何人都有用...正如@ross-wilson 建议的那样,我在 SQL 的SELECT 部分为每个用户选择了多个rep_id,这就是为什么我出现错误。最后我只需要使用GROUP BY 来确保只使用最后一个rep_id,因此每个用户只被插入到表中一次。

DB::insert("
        INSERT INTO user_registration_meta (user_id,rep_id) 
        SELECT users.id AS user_id, 
        COALESCE(rs.rep_id,elt(floor(rand() * $array_length + 1), $active_reps ),0) AS rep_id 
        FROM users 
        LEFT JOIN rep_sessions rs ON users.id=rs.user_id
        GROUP BY users.id");

【讨论】:

    【解决方案2】:

    您可以通过添加模式来修复该错误,只会启用这些模式。

    config/database.php
    
     'mysql' => [
                'driver' => 'mysql',
                'host' => env('DB_HOST', '127.0.0.1'),
                'port' => env('DB_PORT', '3306'),
                'database' => env('DB_DATABASE', 'xyz_db'),
                'username' => env('DB_USERNAME', 'root'),
                'password' => env('DB_PASSWORD', ''),
                'unix_socket' => env('DB_SOCKET', ''),
                'charset' => 'utf8',
                'collation' => 'utf8_unicode_ci',
                'prefix' => '',
                'strict' => true,
                'engine' => null,
                'modes' => [
                    'STRICT_TRANS_TABLES',
                    'NO_ZERO_IN_DATE',
                    'NO_ZERO_DATE',
                    'ERROR_FOR_DIVISION_BY_ZERO',
                    'NO_AUTO_CREATE_USER',
                    'NO_ENGINE_SUBSTITUTION',
                ]
            ],
    

    您可以在此处阅读有关模式的更多信息:

    https://dev.mysql.com/doc/refman/8.0/en/sql-mode.html

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-10-18
      • 2013-05-13
      • 2016-07-31
      • 2011-10-25
      • 2016-01-11
      • 2010-09-29
      相关资源
      最近更新 更多