Как я могу объединить две таблицы MySQL?

Проблема в том, что Access (или JET Red) не имеет единого канонического API для работы с его моделью данных, вместо этого вы в основном используете драйвер OLE-DB или драйвер ODBC. Я думаю (но не могу подтвердить), что программа GUI Office Access , вероятно, имеет свой собственный внутренний API, который обходит абстракции OLE-DB или ODBC, к сожалению, программа GUI не использует специальную техническую терминологию в таких вещах, как конструктор таблиц (например, Number > Integer не говорит, является ли оно 16-, 32- или 64-разрядным целым числом, а Number > Replication ID вообще не число, а GUID Win32).

По состоянию на 2019 г. Microsoft, по-видимому, отказалась от приоритетов OLE-DB по сравнению с API-интерфейсом ODBC более низкого уровня для JET Red, но это нормально, потому что ODBC по-прежнему предоставляет нам необходимые детали для определения базы данных. дизайн стола.

В любом случае - хорошая новость заключается в том, что вам не обязательно нужен инструмент для сравнения базы данных Access (JET Red) с базой данных SQL Server, поскольку легко получить спецификации таблицы ODBC самостоятельно.

Примерно так:

Dictionary<String,DataTable> jetTables = new Dictionary<String,DataTable>();

using( OleDbConnection jetConnection = new OleDbConnection( "your-access-connection-string") )
{
    await jetConnection.OpenAsync().ConfigureAwait(false);

    DataTable schemaTable = connection.GetOleDbSchemaTable(
        OleDbSchemaGuid.Tables,
        new object[] { null, null, null, "TABLE" }
    );

    foreach( DataRow row in schemaTable.Rows.Cast<DataRow>() )
    {
        String tableName = (String)row.ItemArray[2];

        DataTable tableSchema = connection.GetOleDbSchemaTable(
            OleDbSchemaGuid.Tables,
            new object[] { null, null, tableName, "TABLE" }
        );

        jetTables.Add( tableName, tableSchema );
    } 
}

Dictionary<String,DataTable> sqlTables = new Dictionary<String,DataTable>();

using( SqlConnection sqlConnection = new SqlConnection( "your-sql-server-connection-string" ) )
{
    await sqlConnection.OpenAsync().ConfigureAwait(false);

    DataTable allTables = new DataTable();
    using( SqlCommand cmd1 = sqlConnection.CreateCommand() )
    {
        cmd1.CommandText = "SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES";

        using( SqlDataReader rdr1 = await cmd1.ExecuteReaderAsync.ConfigureAwait(false) )
        {
            allTables.Load( rdr1 );
        }
    }

    foreach( DataRow row in allTables.Rows.Cast<DataRow>() )
    {
        String tableName = (String)row.ItemArray[0];

        using( SqlCommand cmd2 = sqlConnection.CreateCommand() )
        {
            cmd2.CommandText = "SELECT COLUMN_NAME, DATA_TYPE FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = @tableName";
            cmd2.Parameters.Add( "@tableName", SqlDbType.NVarChar ).Value = tableName;

            using( SqlDataReader rdr2 = await cmd2.ExecuteReaderAsync.ConfigureAwait(false) )
            {
                DataTable dt = new DataTable();
                dt.Load( rdr2 );
                sqlTables.Add( tableName, dt );
            }
        } 
    }
} 

Затем сравните jetTables с sqlTables, как вы того пожелаете.

91
задан dakab 21 February 2017 в 13:07
поделиться

4 ответа

Можно также попробовать:

INSERT IGNORE
  INTO table_1 
SELECT *
  FROM table_2
     ;

который позволяет тем строкам в table_1 заменять тех в table_2, которые имеют первичный ключ соответствия при тихой вставке строк с новыми первичными ключами.

С другой стороны,

REPLACE
   INTO table_1
 SELECT *
   FROM table_2
      ;

уже обновит те строки в table_1 с соответствующей строкой от table_2, при вставке строк с новыми первичными ключами.

121
ответ дан fcw 24 November 2019 в 06:44
поделиться

Это зависит от семантического из первичного ключа. Если это - просто автоинкремент, то используйте что-то как:

insert into table1 (all columns except pk)
select all_columns_except_pk 
from table2;

Если PK означает что-то, необходимо найти способ определить, какая запись должна иметь приоритет. Вы могли создать запрос Select для нахождения дубликатов сначала (см. ответ cpitis). Затем устраните тех, Вы не хотите сохранять и использовать вышеупомянутое, вставляют для добавления записей, которые остаются.

38
ответ дан Community 24 November 2019 в 06:44
поделиться
INSERT
INTO    first_table f
SELECT  *
FROM    second_table s
ON DUPLICATE KEY
UPDATE
        s.column1 = DO_WHAT_EVER_MUST_BE_DONE_ON_KEY_CLASH(f.column1)
21
ответ дан Quassnoi 24 November 2019 в 06:44
поделиться

Если необходимо сделать это вручную, одно время:

Во-первых, слияние во временной таблице, с чем-то как:

create table MERGED as select * from table 1 UNION select * from table 2

Затем отождествите ограничения первичного ключа с чем-то как

SELECT COUNT(*), PK from MERGED GROUP BY PK HAVING COUNT(*) > 1

Где PK является полем первичного ключа...

Решите дубликаты.

Переименуйте таблицу.

[отредактированный - удаленные скобки в Запросе на объединение, который вызывал ошибку в комментарии ниже]

15
ответ дан Christoph 24 November 2019 в 06:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: