Laravel:带有INSERT(外键)的SQL左联接

时间:2018-08-17 09:04:36

标签: php mysql sql laravel foreign-keys

我想用用户表中的user_id填充一个新表,并使用他们没有使用rep的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");

哪个让我犯了这个错误...

  

带有消息“ SQLSTATE [23000]:Illuminate / Database / QueryException”:违反完整性约束:1062键“ PRIMARY”的条目“ 9952085”重复

这是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;中被截断了

有什么想法为什么会出现该错误?

2 个答案:

答案 0 :(得分:1)

您可以通过添加模式来解决该错误,只有这些模式将被启用。

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

答案 1 :(得分:0)

以防万一其他人偶然发现它并对任何人都有用...如@ ross-wilson所建议,我在SQL的rep_id部分为每个用户选择了多个SELECT,这就是为什么我得到一个错误。最后,我只需要使用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");