Мне нужно скрыть идентификаторы таблицы MySQL, используя решение только для MySQL (без кода приложения, такого как PHP), и генерировать уникальные значения.
Вот что мне удалось получить (используя триггер MySQL дляобновить строку, которая была вставлена, со значением comment_hash. Проблема в том, что я получаю ошибку «Duplicate Entry». Я знаю, что хэши не уникальны, но как я могу сопоставить значение UNIQUE _comments.id с уникальным 4-символьным хешем?)
DROP TABLE IF EXISTS _comments;
CREATE TABLE IF NOT EXISTS _comments (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`comment_hash` VARCHAR(255) NOT NULL,
`user_id` int(10) unsigned NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `comment_user_hash_parentid_unique` (`user_id`,`comment_hash`)
) ENGINE=INNODB;
DROP TRIGGER IF EXISTS `test_add_comment_hash_on_insert_into_comments_table`;
DELIMITER //
CREATE TRIGGER test_add_comment_hash_on_insert_into_comments_table
BEFORE INSERT ON _comments
FOR EACH ROW
BEGIN
SET NEW.comment_hash = right(md5(LAST_INSERT_ID()+1),4);
END
//
DELIMITER ;
А потом в моей сеялке (я использую Laravel для удобства множественных вставок в PHP для цикла), но вы можете использовать все что угодно для быстрой вставки.
<?php
use Illuminate\Database\Seeder;
use Faker\Generator as Faker;
// Call using command: php artisan db:seed --class=CommentsFakeDataSeeder
class WtfFakeDataSeeder extends Seeder
{
/**
* Seed the application's database.
*
* @return void
*/
public function run(Faker $faker)
{
echo "Seeding _comments... \n";
DB::statement('SET FOREIGN_KEY_CHECKS=0;');
$fake_comments = [];
for ($i = 0; $i < 10000; $i++) {
$fake_comments[] = [
'user_id' => 1,
];
}
DB::table('_comments')->insert($fake_comments);
DB::statement('SET FOREIGN_KEY_CHECKS=1;');
}
}
Iвызовите сеялку с: php artisan db:seed --class=WtfFakeDataSeeder
Но я всегда получаю нарушение ограничения целостности
Doctrine\DBAL\Driver\PDOException::("SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '1-849b' for key 'comment_user_hash_parentid_unique'")
Если в 4-значном comment_hash разрешены только строчные и буквенно-цифровые символы, мы должны иметь36 ^ 4 = 1679616 значений.Тем не менее, столкновения происходят со вставками <10K, как вы можете видеть ниже.MD5 () не является правильным решением здесь .. вы знаете, что это?идентификаторы всегда уникальны ... объединяю ли я их с идентификатором пользователя (для большей энтропии), как я могу сопоставить их с уникальными 4-символьными значениями хеша? </p>