laravel:sql带insert的左连接(外键)

rhfm7lfc  于 2021-06-20  发布在  Mysql
关注(0)|答案(2)|浏览(290)

我想用 user_id 从users表和reps表中的一个随机rep\u id,在reps表中他们没有使用rep,否则他们希望被分配 rep_id 他们使用的代表。我为user\u id和rep\u id设置了外键,它们都可以为null,但是user\u id也是主键。
我可以这样做来选择 user_id 和一个 rep_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]”的/database/queryexception:完整性约束冲突:键“primary”的1062重复条目“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; 你知道为什么会出现这样的错误吗?

n53p2ov0

n53p2ov01#

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

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

bfhwhh0e

bfhwhh0e2#

万一有人无意中发现这个,它对任何人都有用。。。正如@ross wilson所说,我选择了多个 rep_id 中的每个用户 SELECT sql的一部分,这就是我出错的原因。最后我不得不用 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");

相关问题