首页 > 解决方案 > Laravel:带有 INSERT(外键)的 SQL LEFT JOIN

问题描述

我想用user_idusers 表中的 和 reps 表中他们没有使用代表的随机 rep_id 填充一个新表,否则他们希望被分配rep_id他们使用过的代表。我为 user_id 和 rep_id 设置了外键,两者都可以为空,但 user_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] 照亮/数据库/查询异常:违反完整性约束: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;

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

标签: phpmysqlsqllaravelforeign-keys

解决方案


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

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


推荐阅读