sql >> Databasteknik >  >> RDS >> Sqlserver

Hur man infogar data från en kolumn i en annan tabell

Anledningen till att du får det här felet är att admin_id är inte NULLBAR vilket betyder att du måste har ett admin_id för varje rad. När du utför en INSERT du måste uttryckligen infoga admin_id eftersom det inte är en IDENTITY egenskapskolumnen.

Dina förväntade resultat visar att du vill göra en UPPDATERING , inte en INSERT . En UPPDATERING skulle UPPDATERA admin_id för närvarande i din table_admin tabell istället för att infoga nya rader. Det enda som är oklart är hur table_admin relaterar till tabellinformation . Hur tilldelas john admin_id =1 ?

När du har definierat det, här är UPPDATERING

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

Om du inte bryr dig vilket admin_name får vad admin_id , då kan du skapa en surrogatnyckel och uppdatera din tabell. Det skulle se ut så här:

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

REDIGERA

Om du inte har några admin_name för närvarande ifylld i table_admin då föreslår jag att du bara trunkerar den tabellen och infogar ditt distinkta admin_name . Återigen, jag skulle också göra admin_id en identitetsegenskap

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

Jag bör betona att i de flesta scheman är admin_id skulle betyda något. Det skulle vara en PRIMÄRNYCKEL för denna tabell och användas för att relatera denna tabell till andra i databasen. Alltså, utan att veta vilket admin_id går till vilken admin_name betyder att du har en riktig röra på dina händer och att tilldela dem slumpmässigt bör bryta nedströmsprocesser... men det kanske inte är fallet eftersom du inte har hållit på med det till att börja med.

Jag skulle fråga varför? Detta skulle antyda att du har en mappning av admin_name till admin_id redan... men det har du inte visat.




  1. är PDO::PARAM_INT redundant?

  2. Hash-anslutningar på nullbara kolumner

  3. SQL Server dynamisk PIVOT-fråga?

  4. ha räkna med join