2

5桁の整数にしたいMySql列を作成しようとしています。ソフトウェアから使用する最初の 2 桁と、データベースから生成する最後の 3 桁。

例:店舗番号1010000より1000110002他の店舗の場合 例:店舗番号20200002000120002...

4

2 に答える 2

1

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 ...に関係なく、注文ごとに単純な自動インクリメントを使用してみませんか。

于 2012-10-10T08:04:17.477 に答える
0

コメントで示唆されているように、そのアプローチを検討してください。単純に 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 の例ですが、単純にstrlenstr_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を使用して単純に拡張します。

于 2012-10-10T08:11:34.583 に答える