MySQL 插入功能类似于 Window 的默认文件命名
MySQL Insert with functionality similar to Window's default file naming
我有一个带有名称列的 table。最初没有将名称添加到 table,但我想在插入新行时添加默认名称,这在功能上很像 window 在创建新文件时的功能。我正在尝试弄清楚如何查询序列中应该是下一个的数字。
例如,如果我的 table 看起来像这样:
id | name
==========
1 | New Name (1)
2 | real name
3 | New Name
下一个插入行的名称应该是 "New Name (2)"。如果我的 table 看起来像这样:
id | name
==========
1 | New Name (2)
2 | real name
或者这个:
id | name
==========
1 | another name
2 | real name
下一个插入行的名称应该是 "New Name"。如果我的 table 看起来像这样:
id | name
==========
1 | New Name (2)
2 | real name
3 | New Name
4 | New Name (3)
下一个插入行的名称应该是 "New Name (1)"。到目前为止,我能够创建查询以获取现有数字 ("New Name" = 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 是查询的结果(试图保持干净)table 并且它的列名是 name_num:
SELECT IFNULL(row_number, (SELECT IFNULL(MAX(name_num),0)
FROM num_data))
FROM (SELECT @rownum:=@rownum + 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;
但这似乎也不对。
如果您想要给定名称的下一个名称,我希望查询如下所示:
select (case when count(*) = 0 then $name
else concat($name, '(',
max(substring_index(name, ' (', -1) + 0) + 1,
')')
end)
from num_data
where name rlike concat($name, ' [(][0-9]+[)]' or
name = $name;
Here 是 SQL Fiddle 演示。
这假设被测试的名称是由一个名为 $name
的参数提供的。
注意:以上查询生成了新名称。如何按顺序得到下一个数字应该是显而易见的。
由于@GorodonLinoff 的回答,这成功了:
select (case when count(*) = 0 then '$name'
when max(name = '$name') = 0 then '$name'
when max(name = '$name(1)') = 0 then '$name(1)'
else concat('$name', '(', max(substring_index(name, '(', -1) + 0) + 1, ')')
end)
from data
where name rlike concat('$name', '[(][0-9]+[)]') or
name = '$name';
我有一个带有名称列的 table。最初没有将名称添加到 table,但我想在插入新行时添加默认名称,这在功能上很像 window 在创建新文件时的功能。我正在尝试弄清楚如何查询序列中应该是下一个的数字。
例如,如果我的 table 看起来像这样:
id | name
==========
1 | New Name (1)
2 | real name
3 | New Name
下一个插入行的名称应该是 "New Name (2)"。如果我的 table 看起来像这样:
id | name
==========
1 | New Name (2)
2 | real name
或者这个:
id | name
==========
1 | another name
2 | real name
下一个插入行的名称应该是 "New Name"。如果我的 table 看起来像这样:
id | name
==========
1 | New Name (2)
2 | real name
3 | New Name
4 | New Name (3)
下一个插入行的名称应该是 "New Name (1)"。到目前为止,我能够创建查询以获取现有数字 ("New Name" = 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 是查询的结果(试图保持干净)table 并且它的列名是 name_num:
SELECT IFNULL(row_number, (SELECT IFNULL(MAX(name_num),0)
FROM num_data))
FROM (SELECT @rownum:=@rownum + 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;
但这似乎也不对。
如果您想要给定名称的下一个名称,我希望查询如下所示:
select (case when count(*) = 0 then $name
else concat($name, '(',
max(substring_index(name, ' (', -1) + 0) + 1,
')')
end)
from num_data
where name rlike concat($name, ' [(][0-9]+[)]' or
name = $name;
Here 是 SQL Fiddle 演示。
这假设被测试的名称是由一个名为 $name
的参数提供的。
注意:以上查询生成了新名称。如何按顺序得到下一个数字应该是显而易见的。
由于@GorodonLinoff 的回答,这成功了:
select (case when count(*) = 0 then '$name'
when max(name = '$name') = 0 then '$name'
when max(name = '$name(1)') = 0 then '$name(1)'
else concat('$name', '(', max(substring_index(name, '(', -1) + 0) + 1, ')')
end)
from data
where name rlike concat('$name', '[(][0-9]+[)]') or
name = '$name';