我有2个表:会话和作业.此赋值表有一个名为scriptname字符串作为值的列.会议表有等于列名scriptname+列id,uid,timein和timeout.当我向分配添加新实例时,我在scriptname列中获取新值,我想将其添加为默认值为0的会话的新列.我该怎么做?
我目前所做的是删除表并根据scriptname列创建一个新表.问题当然是我丢失了所有数据.
DROP TABLE sessions;
SET SESSION group_concat_max_len = 1000000;
SELECT
CONCAT(
'CREATE TABLE sessions (',
GROUP_CONCAT(DISTINCT
CONCAT(scriptname, ' BOOL DEFAULT 0')
SEPARATOR ','),
');')
FROM
assignments
INTO @sql;
PREPARE stmt FROM @sql;
EXECUTE stmt;
ALTER TABLE sessions
ADD COLUMN `timeout` timestamp not null FIRST,
ADD COLUMN `timein` timestamp not null DEFAULT CURRENT_TIMESTAMP FIRST,
ADD COLUMN `uid` VARCHAR(128) not null FIRST,
ADD COLUMN `id` INT(11) AUTO_INCREMENT PRIMARY KEY not null FIRST;
Run Code Online (Sandbox Code Playgroud)
我希望有人可以帮助我,因为我真的不是sql的专家!提前致谢.
相反,请考虑向表中添加行.然后,稍后,"旋转"以在显示输出时创建列.
正如您所发现的那样,添加列非常笨拙.添加太多列最终会达到一些限制.添加行基本上是无限的.
在这个论坛中多次讨论了透视,所以我不会在这里重复这些讨论.
您必须以某种方式知道新添加的列的列表。例如,您可能有一个名为date_added添加新会话时记录的列。
如果您没有此类列,则可以从 INFORMATION_SCHEMA.COLUMNS 获取列列表。然后您需要创建一个ALTER TABLE像这样的脚本(这将为四月份添加的会话添加新列到表中):
SET SESSION group_concat_max_len = 1000000;
SELECT
CONCAT(
'ALTER TABLE sessions ',
GROUP_CONCAT(DISTINCT
CONCAT('ADD COLUMN ', scriptname, ' BOOL DEFAULT 0')
SEPARATOR ','),
';')
FROM
assignments
WHERE scriptname NOT IN (
SELECT COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE table_name = 'sessions'
AND table_schema = '<your schema>')
INTO @sql;
PREPARE stmt FROM @sql;
EXECUTE stmt;
-- this should generate this:
-- ALTER TABLE sessions
-- ADD COLUMN blah1 BOOL DEFAULT 0,
-- ADD COLUMN blah2 BOOL DEFAULT 0;
Run Code Online (Sandbox Code Playgroud)
但是,我必须指出,您需要重新设计存储数据的方式。您存储它的方式不是最佳的。您需要将会话存储在行中,而不是像您那样存储在列中。如果您需要以这种方式呈现数据,您可以构建一个查询来透视数据。
| 归档时间: |
|
| 查看次数: |
701 次 |
| 最近记录: |