アカウントと呼ばれるテーブルにデータを挿入したいのですが、フィールドの1つに11から始まり、9桁の長さの乱数があります(例:112345673または119876543)。これはSQLで可能ですか、それともPHPで行う必要があります。次にそこに挿入しますか?
6 に答える
一度に1行ずつ挿入する場合...
--INSERT dbo.table(column1, random_column)
SELECT 'column1_value',
'11' + RIGHT(REPLACE(CONVERT(VARCHAR(12), RAND()), '.', ''), 3)
+ RIGHT(REPLACE(CONVERT(VARCHAR(12), RAND()), '.', ''), 4);
これが複数行のSELECTの一部である場合、各行に同じ番号が割り当てられているので、各行の他のデータに基づいて(またはNEWID()
コンラッドが指摘したように使用して)ランダム化する必要があります。
--INSERT dbo.table(column1, random_column)
SELECT name, '11' + RIGHT(1000000 + ABS(CONVERT(BIGINT,
CONVERT(VARBINARY(16), NEWID()))), 7)
FROM sys.all_objects;
INSERT
(結果を個別にテストできるようにコメントアウトしました。)
これにより、11桁の乱数が得られます。乱数が9桁より短い場合は、接頭辞としてゼロが付けられるため、全長は常に11になります。
select '11' + right('11000000000' +
cast(abs(convert(bigint,convert(varbinary(8),newid()))) as varchar(20)), 9)
多分これは過度に単純化110000000 + (ABS(CHECKSUM(NEWID())) % 10000000)
されていますが、あなたが望むものを作り出すための非常に軽量な方法でしょう。
それで
ALTER TABLE mySchema.myTable ADD CONSTRAINT DF_myColumn
DEFAULT 110000000 + (ABS(CHECKSUM(NEWID())) % 10000000) FOR myColumn
PHPを使用します。
$randnum = "11".rand(1000000, 9999999);
次に、それをクエリに挿入するだけで、出来上がりです。
可能ですが、優れたパフォーマンスではありません。これを試して。
insert into table2(randomNumberColumn)
select convert(bigint,'11' + convert(varchar(100),convert(bigint,right(convert(varchar(100),abs(convert(int,convert(varbinary(16),newid())))),7)))) as a
from table1
これに関する1つの問題は、11桁の長さを保証しないことです。数が少ないために10になることもあります。乱数ジェネレーターが小さい数を思いついたときに、余分な0を入力する方法を実際に調べていません。
私は試してみます:
SELECT '11'+REPLACE(STR(RAND(),9,7),'0.','')
...またはこのわずかなバリエーション...
SELECT '11'+RIGHT(STR(RAND(),9,7),7)
...どちらか速い方。