根据mysql中另一个表中的新条目在一个表中添加新列

Ans*_*s86 8 mysql sql

我有2个表:会话和作业.此赋值表有一个名为scriptname字符串作为值的列.会议表有等于列名scriptname+列id,uid,timeintimeout.当我向分配添加新实例时,我在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的专家!提前致谢.

Ric*_*mes 8

相反,请考虑向表中添加行.然后,稍后,"旋转"以在显示输出时创建列.

正如您所发现的那样,添加列非常笨拙.添加太多列最终会达到一些限制.添加行基本上是无限的.

在这个论坛中多次讨论了透视,所以我不会在这里重复这些讨论.


cha*_*cha 3

您必须以某种方式知道新添加的列的列表。例如,您可能有一个名为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)

但是,我必须指出,您需要重新设计存储数据的方式。您存储它的方式不是最佳的。您需要将会话存储在行中,而不是像您那样存储在列中。如果您需要以这种方式呈现数据,您可以构建一个查询来透视数据。