0

SQL を使用して、インデックス (番号) で列に名前を付けるテーブルを作成できるかどうか疑問に思っています。たとえば、1,000 万個程度の列を含むテーブルを作成したいのですが、すべての列に名前を付けたくはありません...

SQL コマンドとして長い文字列を生成するスクリプトを作成できることを知っています。ただし、よりエレガントな方法があるかどうかを知りたい

私がここで作り上げるもののように:

CREATE TABLE table_name
(
number_columns 10000000,
data_type INT
)

1,000 万の列があると言うと、多くの混乱が生じたと思います。申し訳ありません。いくつかの主要な商用 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

動的 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;
$$;

しかし、なぜそのような怪物に命を与えたいのでしょうか?

@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

一般に、データベースを操作する場合、スキーマは多かれ少なかれ「定義」されている必要があるため、動的な列の追加は組み込みの機能ではありません。

ただし、ループを実行して、次の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 に答える
0

注: @GDP が述べたように、4096 列しか持てず、間違いなくこのアイデアは評価されません。@GDP は、データベース設計のアイデアを検討して、この要件を処理するためのより良い方法があるかどうかを検討する必要があると述べました。

しかし、これを行う必要があるかどうかは、ばかげた要件とは別に、どうすればよいのでしょうか。カスタム/ユーザー定義のMySQL関数、たとえば create_table() を作成しない理由を考えました。これは、送信するパラメーターを受け取り、必要なCREATE TABLEコマンドを生成します。

于 2012-06-15T16:14:24.473 に答える