Как вставить данные из одного столбца в другую таблицу - PullRequest
0 голосов
/ 15 января 2019

Я уже давно борюсь с этой проблемой на работе, и мне нужна помощь.

У меня есть 2 таблицы, одна с кучей информации и другая, где часть информации должна быть, мне нужно переместить один столбец в таблицу, уже созданную с некоторыми кодами, чтобы идентифицировать каждую строку, которая будет вставлена ​​( в основном это пользователи), и он выдает ошибку, потому что говорит, что я должен также вставить идентификатор, но идентификатор уже есть.

допустим, у меня есть эти таблицы:

table_information
admin_name|admin_address|admin_phone|admin_mail
john      |home         |111111111  |something@mail.com
pete      |house        |222222222  |else@mail.com
mike      |crib         |333333333  |my@mail.com
ryan      |someplace    |444444444  |custom@mail.com
daniel    |somewhere    |555555555  |user@mail.com
bruce     |anywhere     |666666666  |bruce@mail.com
dave      |everywhere   |777777777  |dave@mail.com


table_admin
admin_id|admin_name
1       |
2       | 
3       |
4       |
5       |
6       |
7       |

и мне нужно переместить столбец имен пользователей в таблицу users, у которой есть коды, поэтому результат должен быть примерно таким:

table_information
admin_name|admin_address|admin_phone|admin_mail
john      |home         |111111111  |something@mail.com
pete      |house        |222222222  |else@mail.com
mike      |crib         |333333333  |my@mail.com
ryan      |someplace    |444444444  |custom@mail.com
daniel    |somewhere    |555555555  |user@mail.com
bruce     |anywhere     |666666666  |bruce@mail.com
dave      |everywhere   |777777777  |dave@mail.com

table_admin
admin_id|admin_name
1       | john
2       | pete
3       | mike
4       | ryan
5       | daniel
6       | bruce
7       | dave

информация поступает из большой базы данных (около 1500 строк), в которой имена администраторов повторяются, поэтому я использовал select Different для фильтрации некоторых дублирующихся строк.

То, как я это делал, выглядит так:

INSERT INTO table_admin (admin_name)
SELECT DISTINCT admin_name FROM table_information

И я получаю это:

Cannot insert the value NULL into column 'admin_id' column does not allow nulls. INSERT fails.

Также важно, чтобы столбец admin_id из таблицы table_admin не мог быть идентификатором (или автоинкрементом), поэтому идентификаторы не могли быть сгенерированы автоматически (я бы сделал это таким образом, но это так, как они работают) здесь).

Мне чего-то не хватает? делать что-то не так? Дайте мне знать некоторые предложения или решения этой проблемы, которая сводит меня с ума, пожалуйста.

Заранее спасибо за чтение.

1 Ответ

0 голосов
/ 15 января 2019

Невозможно вставить значение NULL в столбец 'admin_id', недопустимые значения NULL. Вставить не удается.

Причина, по которой вы получаете эту ошибку, заключается в том, что admin_id - это не NULLABLE, то есть вы должны иметь admin_id для каждой строки. Когда вы выполняете INSERT, вы должны явно вставить admin_id, так как это не столбец свойства IDENTITY.

Ваши ожидаемые результаты показывают, что вы хотите сделать UPDATE, а не INSERT. UPDATE будет UPDATE admin_id, который в настоящее время находится в вашей таблице table_admin, вместо вставки новых строк. Единственное, что неясно, это то, как table_admin относится к table_information. Как Джону назначают admin_id = 1?

Как только вы определите это, вот UPDATE

update t 
set t.admin_name = i.admin_name
from table_admin t
inner join table_information i on i.someColumn = t.someColumn

Если вам все равно, какой admin_name что получит admin_id, тогда вы можете создать суррогатный ключ и обновить таблицу. Это будет выглядеть так:

select distinct 
    admin_name
    ,admin_id = row_number() over (order by (select null))
into #tempInformation
from table_information

--this is going to show the admin_id that will be updated in the table_admin table
select * from #tempInformation

update t 
set t.admin_name = i.admin_name
from table_admin t
inner join #tempInformation i on i.admin_id = t.admin_id

EDIT

Если у вас нет каких-либо admin_name, в настоящее время заполненных в table_admin, тогда я предлагаю вам просто обрезать эту таблицу и вставить свой отличный admin_name. Опять же, я бы также сделал admin_id свойством * 1047

truncate table table_admin

insert into table_admin (admin_id, admin_name)
   select distinct 
        admin_id = row_number() over (order by (select null))
        ,admin_name

Я должен подчеркнуть, что в большинстве схем admin_id будет что-то значить. Это будет PRIMARY KEY для этой таблицы и будет использоваться для связи этой таблицы с другими в базе данных. Таким образом, незнание того, что admin_id означает, к какому admin_name означает, что у вас есть настоящий беспорядок, и случайное присвоение их должно сломать последующие процессы ... но это может быть не так, поскольку вы не поддерживал это с самого начала.

столбец admin_id из таблицы table_admin не может быть идентификатором

Я бы спросил, почему? Это намекает на то, что у вас уже есть отображение от admin_name до admin_id ... но вы этого не показали.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...