是否可以按索引命名

时间:2012-06-15 15:37:12

标签: mysql sql database postgresql database-design

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

语言是否支持?

5 个答案:

答案 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)