php - Laravel:带有 INSERT(外键)的 SQL LEFT JOIN
问题描述
我想用user_id
users 表中的 和 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;
任何想法为什么会出现这个错误?
解决方案
您可以通过添加模式来修复该错误,只会启用这些模式。
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',
]
],
您可以在此处阅读有关模式的更多信息:
推荐阅读
- mediawiki - 语义 wiki 像数据库一样写入 wiki
- c - C 中的重复 SSL_connect 导致 SIGSEGV
- datetime - 如何将实际日期时间用于 Odoo 11 中的字段
- prolog - 在 Prolog 中匹配 DFG 的一部分
- robotics - 如何将两种不同类型的数据“融合”在一起以获得最终结果?
- c# - 使用 C# 算法调整 Powershell Forms 脚本
- c# - 使用 lightinject 拦截在 mvc 5 中使用参数拦截动作控制器
- django - 微服务架构中的 Django admin + 身份验证系统
- java - 在 Java 中使用流将 double[] 转换为 byte[]
- download - Chrome 下载标签不下载文件