5桁の整数にしたいMySql列を作成しようとしています。ソフトウェアから使用する最初の 2 桁と、データベースから生成する最後の 3 桁。
例:店舗番号10
は10000
より10001
、10002
他の店舗の場合 例:店舗番号20
は20000
、20001
、20002
...
order_idを自動インクリメントフィールドにしてから、store_idとorder_idに(この順序で)主キーを作成します。
このようにして、order_idはstore_idごとに個別にカウントされます。
この例を参照してください: http ://sqlfiddle.com/#!2 / 33b3e / 1
完全なコード:
CREATE TABLE order_ticket_number ( id_store_ticket int(10) NOT NULL,
id_order_ticket int(10) AUTO_INCREMENT NOT NULL,
id_order int(10) unsigned NOT NULL default 0,
PRIMARY KEY (id_store_ticket,id_order_ticket)
)
ENGINE=myisam DEFAULT CHARSET=utf8;
INSERT INTO order_ticket_number (id_store_ticket) VALUES (10),(10),(20),(20);
編集:これはMyIsamでのみ実行でき、(明らかに)InnoDBでは実行できません。
ですから、2つの選択肢があると思います。アプリケーションロジックでこれを処理するか、番号付けを処理するためだけにMyIsamテーブルを作成します。そこに挿入すると、order_idがわかり、それをInnoDBテーブルに挿入できます。これは最もエレガントな解決策のようには見えませんが。自分で生成しようとするよりもはるかにエラープルーフだと思います(競合状態)。
あなたが自分自身に尋ねるべき最後のことは、なぜあなたがこれらの数字を持ちたいのかということです。store_id ...に関係なく、注文ごとに単純な自動インクリメントを使用してみませんか。
コメントで示唆されているように、そのアプローチを検討してください。単純に 2 つの列を作成し、それらを UNIQUE でバインドして、競合がないようにします。Store ID 10 の最初の ID を探す場合は、単純にWHERE store_id = 10 AND other_id = 1
. より論理的で、これを次のように出力する単純な関数を作成できます100001
。
function store_string($int_store_id, $int_other_id) {
$str = str_repeat('0', (2 - strlen($int_store_id))).$int_store_id;
$str .= str_repeat('0', (3 - strlen($int_other_id))).$int_other_id;
return $str;
}
(PHP の例ですが、単純にstrlenとstr_repeatを調べて、アイデアを得ることができます。
これにより、どちらの値も簡単に検索できるなど、多くの利点が得られますstore_id
。既存のすべての行と出力関数だけを変更することなく、99 を超える可能性があります。
実際の に関しては、次のINSERT
ように挿入を実行できます。
INSERT INTO table_name (store_id, other_id, third_value)
SELECT {$store_id}, (other_id + 1), {$third_value}
FROM (( SELECT other_id
FROM table_name
WHERE store_id = {$store_id}
ORDER BY other_id DESC)
UNION ALL
( SELECT '0')
LIMIT 1) AS h
そして、同じ方法でより多くの値$third_value
を使用して単純に拡張します。