0

我想知道是否可以使用 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

语言支持吗?

4

5 回答 5

2

忍不住调查一下,发现MySQL Docs对此说“不”,那

每个表有 4096 列的硬性限制,但给定表的有效最大值可能会更少

于 2012-06-15T15:43:20.257 回答
1

可以在Postgres中使用动态 SQL轻松做到这一点。考虑演示:

DO LANGUAGE plpgsql
$$
BEGIN
    EXECUTE '
    CREATE TEMP TABLE t ('
    || (
        SELECT string_agg('col' || g || ' int', ', ')
        FROM generate_series(1, 10) g  -- or 1600?
        )
    || ')';
END;
$$;

但是你为什么还要给这样一个怪物生命呢?

正如@AH 评论的那样, PostgreSQL 中的列数有一个硬性限制:

一个表可以包含多少列是有限制的。根据列类型,它介于 250 和 1600 之间。但是,定义一个包含这么多列的表是非常不寻常的,并且通常是一个有问题的设计。

强调我的。更多关于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
于 2012-06-15T16:09:18.690 回答
0

注意:正如@GDP 所提到的,您只能拥有 4096 列,而且这个想法肯定不受欢迎,而且@GDP 再次表示,需要探索数据库设计想法以考虑是否有其他方法可以更好地处理此要求。

但是,我只是想知道除了荒谬的要求之外,如果我需要这样做,我该怎么做?我想为什么不创建一个自定义/用户定义的 MySQL 函数,例如 create_table() 它将接收您打算发送的参数,然后生成所需的CREATE TABLE命令。

于 2012-06-15T16:14:24.473 回答
0

通常,在使用数据库时,您的架构应该或多或少“定义”,因此动态列添加不是内置功能。

但是,您可以运行一个循环并不断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;

但是再一次,就像你得到的大多数建议一样,如果你认为你需要那么多列,你可能需要看看你的数据库设计,我个人从未听说过需要这样的案例。

于 2012-06-15T16:01:49.510 回答
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)
于 2016-10-27T08:41:53.180 回答