我想用用户表中的user_id
填充一个新表,并使用他们没有使用rep的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]: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;
中被截断了
有什么想法为什么会出现该错误?
答案 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',
]
],
您可以在此处了解有关模式的更多信息:
答案 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");