我想知道是否可以使用SQL创建一个按索引(数字)命名列的表。说,我想创建一个包含1000万左右列的表,我绝对不想为每一列命名......
我知道我可以编写一个脚本来生成一个长字符串作为SQL命令。但是,我想知道是否有更优雅的方式
就像我在这里制作的东西一样:
CREATE TABLE table_name
(
number_columns 10000000,
data_type INT
)
我想说1000万列引起了很多混乱。对于那个很抱歉。我查阅了几个主要商业DBMS的手册,似乎不可能。谢谢你指出这一点。
但另一个最重要的问题是,SQL支持列的数字命名,比如所有列都具有相同的类型,并且有50列。在提到时,就像
一样SELECT COL.INDEX(3), COL.INDEX(2) FROM MYTABLE
语言是否支持?
答案 0 :(得分:2)
无法抗拒调查此事,并发现MySQL Docs对此说“不”,
每张表有4096列的硬限制,但有效 对于给定的表格,最大值可能更小
答案 1 :(得分:1)
您 可以动态SQL 在 Postgres 中轻松实现。考虑一下演示:
DO LANGUAGE plpgsql
$$
BEGIN
EXECUTE '
CREATE TEMP TABLE t ('
|| (
SELECT string_agg('col' || g || ' int', ', ')
FROM generate_series(1, 10) g -- or 1600?
)
|| ')';
END;
$$;
但为什么你甚至想要为这样的怪物生活?
作为@ A.H。评论说,number of columns in PostgreSQL:
有一个硬性限制表格可以包含的列数有限制。取决于 列类型,介于250和1600之间。但是,定义一个 在这么多列附近的任何地方的桌子都非常不寻常并经常 一个有问题的设计。
强调我的。 有关table limitations in the Postgres Wiki的更多信息。
关于您的其他问题:使用上述模式,您只需编写:
SELECT col3, col2 FROM t;
我不知道按索引引用列的内置方法。您可以再次使用动态SQL。或者,对于仅由整数列组成的表,这也适用:
SELECT c[3] AS col3, c[2] AS col2
FROM (
SELECT translate(t::text, '()', '{}')::int[] AS c -- transform row to ARRAY
FROM t
) x
答案 2 :(得分:0)
通常,在使用数据库时,您的架构应该或多或少地“定义”,因此动态列添加不是内置功能。</ p>
但是,您可以运行循环并不断ALTER TABLE
添加如下列:
BEGIN
SET @col_index = 0;
start_loop: LOOP
SET @col_index = @col_index + 1;
IF @col_index <= num_columns THEN
SET @alter_query = (SELECT CONCAT('ALTER TABLE table_name ADD COLUMN added_column_',@col_index,' VARCHAR(50)'));
PREPARE stmt FROM @alter_query;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
ITERATE start_loop;
END IF;
LEAVE start_loop;
END LOOP start_loop;
END;
但同样,就像你给出的大部分建议一样,如果你认为你需要那么多专栏,你可能需要看看你的数据库设计,我个人从来没有听说过需要这样的案例。
答案 3 :(得分:0)
注意:正如@GDP所提到的,你只能拥有4096个cols,绝对不会赞赏这个想法,而且@GDP再次说需要探索数据库设计思路,以考虑是否有其他东西可以更好地处理这个问题。要求。
然而,我只是想知道除了荒谬的要求,如果我需要这样做我怎么能这样做?我想为什么不创建自定义/用户定义的MySQL函数,例如create_table()将接收您要发送的参数,然后生成所需的CREATE TABLE
命令。
答案 4 :(得分:0)
这是使用序数值查找列的选项。它可能不是最优雅或最有效的,但它的工作原理。我正在使用它来创建一个新表,以便在我需要解析所有列/行的数据之间实现更快的映射。
DECLARE @sqlCommand varchar(1000)
DECLARE @columnNames TABLE (colName varchar(64), colIndex int)
DECLARE @TableName varchar(64) = 'YOURTABLE' --Table Name
DECLARE @rowNumber int = 2 -- y axis
DECLARE @colNumber int = 24 -- x axis
DECLARE @myColumnToOrderBy varchar(64) = 'ID' --use primary key
--Store column names in a temp table
INSERT INTO @columnNames (colName, colIndex)
SELECT COL.name AS ColumnName, ROW_NUMBER() OVER (ORDER BY (SELECT 1))
FROM sys.tables AS TAB
INNER JOIN sys.columns AS COL ON COL.object_id = TAB.object_id
WHERE TAB.name = @TableName
ORDER BY COL.column_id;
DECLARE @colName varchar(64)
SELECT @colName = colName FROM @columnNames WHERE colIndex = @colNumber
--Create Dynamic Query to retrieve the x,y coordinates from table
SET @sqlCommand = 'SELECT ' + @colName + ' FROM (SELECT ' + @colName + ', ROW_NUMBER() OVER (ORDER BY ' + @myColumnToOrderBy+ ') AS RowNum FROM ' + @tableName + ') t2 WHERE RowNum = ' + CAST(@rowNumber AS varchar(5))
EXEC(@sqlCommand)