1

データベースに 30 個のテーブルがあり、すべて InnoDB です。彼らは彼らの構造を持っています。

私がやりたいことは、実際に次の列をすべてのテーブルに追加することです。

  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` text COLLATE utf8_unicode_ci NOT NULL,
 `description` text COLLATE utf8_unicode_ci NOT NULL,
 `categoryId` int(11) NOT NULL,
 `imageId` int(11) NOT NULL,
 `created` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
 `updated` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
 `createdId` int(11) NOT NULL,
 `updatedId` int(11) NOT NULL,
 `allowedEmployeeIds` text COLLATE utf8_unicode_ci NOT NULL,

プログラミング言語 (PHP を想定) では、通常のアプローチは抽象クラスを作成し、そこにすべての共通変数を配置してから継承することです。MySQLはどうですか?どうすればいいですか?

設計上の理由により、commonDataテーブルを作成して外部キー/結合を使用することはできません。create ステートメントはゼロから作成しているため、更新の必要はありません。

4

4 に答える 4

0

これは古いトピックであることは承知していますが、提示されたソリューションは、テーブルの作成時に必要な列を作成する方法を示しています。これは、実際には入力を節約するデバイスです。

これについては、デザインの観点からもっと考えていました。この場合、共通の列を使用して 2 番目のテーブルを定義できます。例えば ​​:

CREATE TABLE article 
    :
    :

CREATE TABLE classified_ad
     :
     :

CREATE TABLE details
    :
 `details_id` int(11) NOT NULL AUTO_INCREMENT,
  `name` text COLLATE utf8_unicode_ci NOT NULL,
 `description` text COLLATE utf8_unicode_ci NOT NULL,
       :
 `categoryId` int(11) NOT NULL,
 `allowedEmployeeIds` text COLLATE utf8_unicode_ci NOT NULL,

  parent_id int(11) NOT NULL
  parent_table enum('classified_ad', 'article')

これに関する 1 つの問題は、結合を強制することによるパフォーマンスの低下です。したがって、これらのスキーマにはおそらくあまりメリットはありません。

ただし、詳細を報告する必要がある場合。たとえば、許可された従業員に関するレポートを作成すると、次のようなメリットが表示されます。

SELECT * from details WHERE allowedEmployeeIds = '1';

言うまでもなく、別々のテーブルでそれを行うときのユニオン。

于 2013-10-18T14:13:33.490 に答える
0

私はこれをしばらく考えてみます - それは複雑で、あなたがやろうとしていることに光を加えるでしょう. 後で多くの作業が追加されます。

しかし、本当にこれを行いたい場合は、これをテーブル定義に入れるのではなく、これらの列をテーブルに追加できるスクリプトを作成する方法があります。

何かのようなもの:

ALTER TABLE table_name
ADD `id` int(11) NOT NULL AUTO_INCREMENT,
ADD `name` text COLLATE utf8_unicode_ci NOT NULL,
ADD `description` text COLLATE utf8_unicode_ci NOT NULL,
ADD `categoryId` int(11) NOT NULL,
ADD `imageId` int(11) NOT NULL,
ADD `created` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
ADD `updated` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
ADD `createdId` int(11) NOT NULL,
ADD `updatedId` int(11) NOT NULL,
ADD `allowedEmployeeIds` text COLLATE utf8_unicode_ci NOT NULL;

次に、持っているテーブルごとにこのスクリプトを実行するだけです。

すべてのテーブルでこれを行うスクリプトを作成する場合は、次のコマンドを使用します。

SHOW TABLES;

すべてのテーブルを検索します。次に、すべてのテーブルをループし、すべてのテーブルで変更スクリプトを実行します。

于 2012-05-19T00:11:04.827 に答える
0

これを行う最も実用的な方法は、GUI mysql インターフェイスを使用してテーブルを複製することだと思います。たとえば、Mac では SequelPro を使用して、必要に応じてテーブルを複製できますCREATE TABLE。シェル スクリプトなどで s を記述するよりも、数秒しかかかりません。

于 2012-05-19T00:04:37.287 に答える
0

Mysql にはテーブル継承の概念がありません。これらすべての列をすべてのテーブルに追加する必要があります。関心のあるすべてのテーブルのステートメントを生成するスクリプトを作成しMODIFY TABLE ... ADD ...、データベースに対して結果を実行します。

まったく同じ列を 30 個のテーブルに追加する必要のない、データを整理する他の方法を見つけられないのではないかと思います。

于 2012-05-19T00:06:29.980 に答える