私は名前の列を持つテーブルを持っています。最初は名前がテーブルに追加されていませんが、新しいファイルを作成するときにウィンドウの機能と同じように、新しい行が挿入されたときにデフォルトの名前を追加したいと思います。私はシーケンス内の次のものと思われる数をどのように照会するかを理解しようとしています。例えばMySQLの挿入機能はWindowのデフォルトのファイル名に似ています
私のテーブルはこのように見える場合、:
id | name
==========
1 | New Name (1)
2 | real name
3 | New Name
次の挿入行の名前は「新名(2)」である必要があります。
id | name
==========
1 | New Name (2)
2 | real name
またはこの:私のテーブルはこのようになります場合は
id | name
==========
1 | another name
2 | real name
次の挿入行の名前は「新しい名前」でなければなりません。テーブルが次のようになっている場合:
id | name
==========
1 | New Name (2)
2 | real name
3 | New Name
4 | New Name (3)
次の行の名前は、「新しい名前(1)」にする必要があります。これまで私は、既存の番号は(「新しい名前」= 0)
SELECT SUBSTRING_INDEX(SUBSTR(d.name,INSTR(d.name,'(') + 1), ')', 1)
FROM data d
WHERE d.widget_name REGEXP '^New[[:space:]]Name[[:space:]]\\([[:digit:]]\\)$'
UNION
SELECT 0
FROM data d
WHERE d.name REGEXP '^New[[:space:]]Name$'
今、私はいただきました!示されます単一の数に番号のリストをオンにする方法が必要に取得するクエリを作成することができました次のデフォルトの名前列挙。 NOT EXISTS
from this questionを使ってみましたが、上記のコードをFROM
とWHERE
の両方で使用する方法を理解できませんでした。
また、a_horse_with_no_name's answer in this questionを使用してrow_num機能を作成することでこれを試みました。 num_dataは、クエリの結果であると仮定すると、テーブルを(きれいに維持しようとして)、それは列名のはname_numです:
SELECT IFNULL(row_number, (SELECT IFNULL(MAX(name_num),0)
FROM num_data))
FROM (SELECT @rownum:[email protected] + 1 AS row_number, t.*
FROM (num_data) t,
(SELECT @rownum := 0) r) gap_table
WHERE gap_table.row_number <> gap_table.widget_num
ORDER by row_number
LIMIT 1;
しかし、それは右、あまりにもそれを得るためには思えませんでした。
うーん何かが欠けているようだが、私は句はそれほどうまくいかなかったところ、私が代わりに地雷を使用し、クエリで遊んで試してみました。その最大値(名前REGEXP $ name = 0)、次に$ name'を追加することで修正可能な数値を持たない$ nameを持たないときに何が起こるのかが分かりません。しかし、クエリは「最大」のためにギャップを埋めるものではないようです。 –
@KostyaSydoruk。 。 。今働いているはずです。 –
@GorodonLinoffほとんどの場合、それはギャップを埋めるものではなく、すでに$ name(1)などを持っている間に$ nameを持たないケースを処理しませんでした。私はそれをサポートするためにあなたの質問を修正しました。 –