webForumDet fria alternativet

Formel för att snabbt lägga till data i db

Databaser & SQL

10 svar · 1 854 visningar · startad av bigsky

Medlem sedan maj 2002821 inlägg
Frågan#1

Jag har en tabell med två fält, Id och Field. Jag skulle vilja ha en sql fråga för att fylla på med lite data enligt följande.

Id Field
1 1
1 2
1 3
1 ...
1 57
2 1
2 2
2 3
2 ...
2 57
Osv.

Dvs för alla i Id ska det fyllas på upp till talet 57 i Field. Om det är viktig info så kan jag också säga att jag kommer att ha upp till 96 i kolumnen Id.

Hur ska denna sql fråga se ut?

Medlem sedan mars 20034 471 inlägg
#2

Hm... Har du värdet på Id-fältet lagrat någon annanstans?

Kan man alltså hämta värdet på Id från någon annan tabell?

Finns kanske även Field-värdena i en annan tabell?

Vad har du för databas? SQL Server, MySQL, ...?

Om det går att hämta värdena från någon annan tabell blir det enklare, annars kan du tex göra så här:

 -- MS SQL Server 2005 och uppåt
DECLARE @i int = 1

CREATE TABLE #Dummy(
  Tal int,
  IsField bit
)

WHILE @i < 97
BEGIN

  INSERT INTO #Dummy (Tal, IsField) 
  SELECT @i, CASE WHEN @i < 58 THEN 1 ELSE 0 END

  SET @i = @i + 1

END

-- Nu innehåller #Dummy talen 1-96, de första 57 har IsField = 1, resten 0

-- Dags för den INSERT du letar efter

INSERT INTO YourTable(Id, Field)
SELECT
  I.Tal,
  F.Tal
FROM
  #Dummy I
  CROSS JOIN (
    SELECT Tal FROM #Dummy D WHERE IsField = 1
  ) AS F
ORDER BY 
  I.Tal,
  F.Tal

-- ORDER BY om ordningen är viktig

-- Rensa
DROP TABLE #Dummy
Medlem sedan maj 2002821 inlägg
#3

Kör med mysql.

Medlem sedan maj 2002821 inlägg
#4

Som sagt, kör med myQSL, har du någon lösning på den varianten?

Medlem sedan aug. 20039 340 inlägg
#5

Ursäkta snorkigheten, men vad försöker du åstadkomma egentligen? Risken finns att det finns ett bättre sätt att göra det du vill som inte bygger på att ha tabeller med nummerserier.

Medlem sedan maj 2002821 inlägg
#6

Ingen fara. Jag har sedan tidigare här på wF redan blivit rekommenderad att göra på detta sätt. Har du någon lösning enligt ovan fast för mySQL?

Jag vill bara snabbt få in dessa rader i databasen istället för att skriva in dem manuellt.

Medlem sedan mars 20034 471 inlägg
#7

Har du prövat om lösningen ovan funkar för MySQL?

Medlem sedan maj 2002821 inlägg
#8

Nej, antog kanske dumt nog att den inte skulle fungera. Ska testa och återkommer.

Medlem sedan maj 2002821 inlägg
#9
<?php
$con = mysqli_connect("","","","");

if (mysqli_connect_errno())
  {
  echo "Failed to connect to MySQL: " . mysqli_connect_error();
  }

$sql="
DECLARE @i int = 1

CREATE TABLE #Dummy(
  Tal int,
  IsField bit
)

WHILE @i < 97 DO
BEGIN

  INSERT INTO #Dummy (Tal, IsField)
  SELECT @i, CASE WHEN @i < 58 THEN 1 ELSE 0 END
  SET @i = @i + 1

END

INSERT INTO YourTable(Id, Field)
SELECT
  I.Tal,
  F.Tal
FROM
  #Dummy I
  CROSS JOIN (
    SELECT Tal FROM #Dummy D WHERE IsField = 1
  ) AS F
ORDER BY 
  I.Tal,
  F.Tal

DROP TABLE #Dummy
";

if (mysqli_query($con,$sql))
  {
  echo "Success!";
  }
else
  {
  echo "Error: " . mysqli_error($con);
  }
?>

Får felmeddelandet (Har naturligtvis en korrekt databaskoppling annars):

Error: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'DECLARE @i int = 1; CREATE TABLE #Dummy( Tal int, IsField bit ) WHILE @i <' at line 1

Medlem sedan maj 2002821 inlägg
#10

Ingen???

Medlem sedan mars 20034 471 inlägg
#11

bigsky skrev:

<?php
$con = mysqli_connect("","","","");

if (mysqli_connect_errno())
  {
  echo "Failed to connect to MySQL: " . mysqli_connect_error();
  }

$sql="
DECLARE @i int = 1

CREATE TABLE #Dummy(
  Tal int,
  IsField bit
)

WHILE @i < 97 DO
BEGIN

  INSERT INTO #Dummy (Tal, IsField)
  SELECT @i, CASE WHEN @i < 58 THEN 1 ELSE 0 END
  SET @i = @i + 1

END

INSERT INTO YourTable(Id, Field)
SELECT
  I.Tal,
  F.Tal
FROM
  #Dummy I
  CROSS JOIN (
    SELECT Tal FROM #Dummy D WHERE IsField = 1
  ) AS F
ORDER BY 
  I.Tal,
  F.Tal

DROP TABLE #Dummy
";

if (mysqli_query($con,$sql))
  {
  echo "Success!";
  }
else
  {
  echo "Error: " . mysqli_error($con);
  }
?>

Får felmeddelandet (Har naturligtvis en korrekt databaskoppling annars):

Error: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'DECLARE @i int = 1; CREATE TABLE #Dummy( Tal int, IsField bit ) WHILE @i <' at line 1

Det är många år sedan jag senaste programmerade mot MySQL och när du kör hela uttrycket på en gång kan det vara svårt att gissa vad som egentligen inte fungerar.

Några saker du kan prova:

  1. Ändra variabelhanteringen (WHILE i MySQL, Variabler i MySQL)
  2. Stoppa in ';' på alla ställen där ett visst uttryck tar slut. Förhopningsvis får du tydligare felmeddelanden då.
  3. Kör delar av lösningen i taget för att se var det egentligen kraschar.

Pröva t.ex.: (Se länkar ovan)


DECLARE i int DEFAULT 1;

CREATE TABLE #Dummy(
  Tal int,
  IsField bit
);

WHILE i < 97 DO

  INSERT INTO #Dummy (Tal, IsField)
  SELECT i, CASE WHEN i < 58 THEN 1 ELSE 0 END
  SET i = i + 1

END WHILE;

INSERT INTO YourTable(Id, Field)
SELECT
  I.Tal,
  F.Tal
FROM
  #Dummy I
  CROSS JOIN (
    SELECT Tal FROM #Dummy D WHERE IsField = 1
  ) AS F
ORDER BY 
  I.Tal,
  F.Tal
;

DROP TABLE #Dummy;

eller (Se länkar ovan)


SET @i = 1;

CREATE TABLE #Dummy(
  Tal int,
  IsField bit
);

WHILE @i < 97 DO

  INSERT INTO #Dummy (Tal, IsField)
  SELECT @i, CASE WHEN @i < 58 THEN 1 ELSE 0 END
  SET @i = @i + 1

END WHILE;

INSERT INTO YourTable(Id, Field)
SELECT
  I.Tal,
  F.Tal
FROM
  #Dummy I
  CROSS JOIN (
    SELECT Tal FROM #Dummy D WHERE IsField = 1
  ) AS F
ORDER BY 
  I.Tal,
  F.Tal
;

DROP TABLE #Dummy;

eller (vanligt sunt förnuft ;) )

försök att köra bit för bit:


DECLARE i int DEFAULT 1;

SELECT 'Gick'

Om det funkar så funkar variabeltilldelningen.


CREATE TABLE #Dummy(
  Tal int,
  IsField bit
);

SELECT * FROM #Dummy;  //Så klart tom

DROP TABLE #Dummy;

Funkar hanteringen av temptabeller?


DECLARE i int DEFAULT 1;

WHILE i < 10 DO

  SELECT i, CASE WHEN i < 58 THEN 1 ELSE 0 END
  SET i = i + 1

END WHILE;

Funkar while-slingan?

Då bör du, om inte förr, hitta var felet faktiskt är. Då kan man leta efter lösningar därifrån.

254 ms totalt · 4 externa anrop · v20260731065814-full.e96017d9
119 ms — deklarationer (db)
0 ms — hämta statistik (cache)
131 ms — hämta tråd, inlägg och bilagor (db)
120 ms — ändringar (db)