İşte benim hafif kaçık çözüm: kullanıcı adı dize parçaları saklamak için kullanıcı tabloda (örneğin username_string_part
denir) bir varchar sütunu ekleyin ve bir int ikinci sütun (örneğin, username_number_part
) için Sayısal parçası saklayın. Yani superman1 username_number_part
olarak username_string_part
sütun ve "1" in "superman" ayrılmıştır. Yinelenen username_string_part girdileri çok sayıda beklemek değil de, muhtemelen iki sütun üzerinde ya da sadece username_string_part üzerinde, bir dizin oluşturabilirsiniz. Yani, MySQL, sizin oluşturmak tablo böyle bir şey) 'dir:
CREATE TABLE `users` (
`id` int(11) NOT NULL auto_increment,
`username` varchar(25) NOT NULL default '',
`username_string_part` varchar(25) NOT NULL default '',
`username_number_part` int(11) NOT NULL default 0,
PRIMARY KEY (`id`),
KEY `ix_username_string_part` (`username_string_part`)
) TYPE=MyISAM AUTO_INCREMENT=1;
(Kullanıcı adı "superman" username_number_part
sıfır varsayılan olduğunu unutmayın -. Bu önemli)
Eğer birkaç girdileri var sonra, verileri bu gibi bir şey olacaktır:
+----+-----------+----------------------+----------------------+
| id | username | username_string_part | username_number_part |
+----+-----------+----------------------+----------------------+
| 1 | superman | superman | 0 |
| 2 | superman1 | superman | 1 |
| 3 | superman3 | superman | 3 |
+----+-----------+----------------------+----------------------+
Sonra username_number_part
bu bir username_number_part
değeri "artı kendini bir" veritabanında yok asgari değerini seçerek bir durumda bulunuyor. Adı "superman" Yani:
select min(username_number_part) + 1 as min_number_available from users
where username_string_part = 'superman' and username_number_part not in
(select username_number_part - 1 from users where
username_string_part = 'superman');
Bu o username ilk örneği ise dönüş değeri, min_number_available
, NULL
- bu yüzden onlar olabilir - Aksi sonraki ücretsiz yuvası için veya bir tamsayı. Daha sonra "superman" + min_number_available
olarak önerilen adı oluşturmak. İstediğiniz kadar sorguda veya concat yapabilirdi. Yukarıdaki örnekte veri değerini alırsınız ile "2" döndü.
Downsides: Bu depolama (kolon ve indeks) ekleyin ve çok hafif ekler yavaşlatmak için gidiyor. Ayrıca doğal "superman001" ve "superman01" arasında ayırım yapmaz. (Eğer username_string_part
parçası olarak önde gelen sıfırları tedavi olabilir, yani "superman001" "superman00" ve "1" olarak bölünmüş olacağını rağmen.)
Upsides: bu dizine sütun üzerinde tek bir sorgu.
Bir sitenin birden çok veritabanı sorgu ile döngü için yaptığını gerçekten o kadar kötü o kadar çok adı çiftleri olsaydı bütün bunlardan sonra, ben şaşıracaksınız.