-1

我有一个库存表(用于零售店的产品/库存)和一个序列表(为每个库存发行的条形码)。

基本上,当新股票被引入数据库时​​,系统会根据序列表的索引/pri 自动增量值为每只股票发出一个序列号。

问题是他们都互相依赖...

我会解释:

STOCKS TABLE
stock_id int(11) 
product_name varchar(50)
serial int(30) <--- relies on the serials generated by system, stored in the SERIALS TABLE 


SERIALS
sn_id int(11)
stock_id int(11) <-- relies on the new stocks inserted in the stocks table
serial int(30) <---- serial NO generated for specific stock.

STOCKS 插入的位置需要存储为其生成的序列号,并且生成的序列号必须记录在表中,其中包含正在插入的股票的 stock_id (index/pri)。

这基本上意味着 3 个 SQL 语句/新库存:

  1. 获取序列表的下一个 auto inc 值(用于正确生成序列号)
  2. 将股票插入到表中,每个序列都有序列号
  3. 获取所述股票的 insert_id 并将其插入序列表

这行得通,但我想知道是否有更好的方法?到目前为止,这是我运行的内容:

  1. 在主目录上创建一个 serial_lock 文件(这可以防止其他脚本向其他股票发布新的序列号,=避免并发运行冲突..

  2. 通过获取序列表的下一个 auto_increment 值来生成所需的序列号并将其存储在变量中,例如

     $assigned_serials_array[$index] = $prefix . $index; // results in BN-0001 ("BN-" is the prefix and the rest is padded auto inc value incremented per loop
    
  3. INSERT INTO股票,每只股票,获取insert_ID

  4. INSERT INTO serials,发行给特定股票的序列号记录
  5. 循环完成后,删除锁定文件

PS。
我原来的实际上已经对连续表进行了 INSERT,然后在生成 stock_id 后对该连续表进行了更新。我对此感到不舒服,因为发出了另一条 SQL 语句,尽管这是最安全的方式不过,我不需要担心锁定文件和冲突。

嗯..有什么想法吗?

编辑:
我决定改变我的方法..
对于每个 SERIAL GENERATED,是一个 STOCK (stock_id).. 我决定忘记序列号 00001 0002 0003 的增量排序

决定继续使用正在发行 SN 的特定股票的 stock_id..

所以..
获取下一个插入ID,根据它生成SN,
INSERT STOCK,w/生成的SN
INSERT SERIAL记录,将stock_id也引用到相同的下一个插入ID..

完毕!

我只是真的很想拥有一个完美排序的 SN ..

4

1 回答 1

1

不要创建锁定文件——这是错误的。

相反,请使用事务。Perl 中的这个例子:

my $dbh = DBI->connect("dbi:mysql...", "user", "password");
$dbh->begin_work();  # start new transaction
$dbh->do("INSERT INTO serials ..."); # generate new serial
my $new_serial = $dbh->{mysql_insertid};
$dbh->do("INSERT INTO stocks (..., serialno) VALUES (..., $new_serial)");
# do some more work like inserting into other tables
$dbh->commit();  # finally, commit the transaction

请注意,您需要使用 InnoDB 引擎才能使事务工作

于 2012-11-13T07:01:59.523 回答