Just nu i M3-nätverket
Gå till innehåll

Om en viss tabellnamn fins redan


Admini

Rekommendera Poster

Hej

Hur kan man ta reda på om en viss tabellnamn finns redan i databasen?

Jag vill skapa en tabell

CREATE TABLE `tabell1`

 

Men om den redan finns så kommer jag att få ett felmeddelande och kan inte fortsätta.

 

Tack för hjälp

 

Länk till kommentar
Dela på andra webbplatser

Mr Andersson

Då flyttar jag tråden till mySQL-avdelningen.

 

Lägg gärna en extra stund att välja rätt avdelning, då slipper vi flytta trådarna efteråt.

 

 

 

Länk till kommentar
Dela på andra webbplatser

Mr Andersson
Jag trodde du hade en lösning på mitt problem!?

 

Ja det har jag - men bara för MS-SQL. Därav frågan om vilken databas det handlar om.

 

Länk till kommentar
Dela på andra webbplatser

  • 1 month later...
Ja det har jag - men bara för MS-SQL. Därav frågan om vilken databas det handlar om.

 

Ok, hur löser du det för MS-SQL databas?

problemet är återkommande som Ni förstår.

 

Länk till kommentar
Dela på andra webbplatser

Mr Andersson

Man kan göra så här i MS-SQL.

Där databas är namnet på databasen (kan uteslutas om du redan är i rätt databas) och där xxxxxx är det namn på tabellen du vill söka efter.

 

 

 

USE databas

if exists(select table_name from information_schema.tables where table_name = 'xxxxxx') 
select 'finns'
else
select 'finns inte'

 

 

Behöver du flera rader kod inom en IF, måste du skriva begin och end:

 

if bla bla
begin
 rad 1
 rad 2
end
else
begin
rad 1
rad 2
end if

 

 

 

[inlägget ändrat 2006-08-05 18:47:10 av Mr Andersson]

Länk till kommentar
Dela på andra webbplatser

Jag har inte mysql installerat så jag kan inte testa det här, men det verkar som SHOW TABLES listar befintliga tabeller, vilket isåfall skulle ge följande omskrivning av Mr Anderssons exempel:

 

IF EXISTS (SHOW TABLES FROM databasen LIKE 'tabellnamn')

 

Länk till kommentar
Dela på andra webbplatser

Är detta en sql-sats?

I så fall, menar ni så här?

rs.Open "IF EXISTS (SHOW TABLES FROM databasen LIKE 'tabellnamn')", conn, 0, 3

?

 

Länk till kommentar
Dela på andra webbplatser

Är detta en sql-sats?

Admini - jag tror ditt största hinder är att du inte riktigt förstått skillnaden mellan ett databashanteringssystem och klientprogrammering. Detta är inte ovanligt tack vare dagens online-tutorials i ex. php och asp. Idag tycks de flesta nya webbarna tro att sql är en del av scriptspråken just för att alla exempel integrerar två helt skilda tekniska miljöer och får dem att verka som ett enhetligt "språk".

 

För att återgå till din fråga Admini - nej, det enda du slängt in i den sql-sastsen är början på den IF-sats jag föreslog, utan följdsatser. Vilka dina följdsatser är vet ju inte jag.

 

Skall du dock börja använda något annat än simpla frågor från klientscriptet (vilket är fallet här) så föreslår jag att du börjar använda lagrade procedurer i mysql. Läs in dig på dem så kommer du se att du verkligen kan förenkla ditt scriptande.

 

http://mysql.com/doc/refman/5.0/en/stored-procedures.html

 

Länk till kommentar
Dela på andra webbplatser

För att förenkla det hela så går vi tillbaka till:

 

SHOW TABLES FROM databasen LIKE 'tabellnamn'

 

Vilket verkar fungera eftersom jag inte får felmedd.

 

Det enda jag sedan behöver är att lista alla tabeller, alltså skriva ut dem på skärmen.

Det kan inte vara så svårt, eller?

 

Jag vet att du är överlägsen när det gäller programmering, men en annan (jag) är bara glad när den lilla koden fungerar ;-)

 

 

 

Länk till kommentar
Dela på andra webbplatser

  • 2 months later...
Med lite google får man fram lite exempel

 

Vad jag hittar på den sidan är detta:

 

[b]The SHOW TABLES keyword[/b]

MySQL gives us easy access to the complete list of tables in any database that we have access to. Using the show tables keyword, we can retrieve a list of table names in the current database.

To use the show tables command, just pass it as the query for the open method of a recordset object:

adoRS.Open "SHOW TABLES"

This would return a complete list of all tables names in the current database. Each table name would occupy a new row in the results set

 

och när jag använder koden adoRS.Open "SHOW TABLES"

så får jag fel:

Invalid connection.

 

 

 

Länk till kommentar
Dela på andra webbplatser

Kan det vara så att sådana queries från mysql kräver någon viss typ av cursor-typ? Pröva att använda implicit skapade recordsets istället, dvs. använd metoden Set rs=conn.Execute("din query").

 

Den andra varianten är bara onödigt resurskrävande om du inte använder de extra metoder och egenskaper som följer med ett explicit recordset (samt att det kan strula om du sätter fel låsningstyp och cursor-typ, vilket kanske som sagt är problemet i det här fallet)

 

Länk till kommentar
Dela på andra webbplatser

Oj oj oj , anjuna, det funkar ju :thumbsup:

så här:

 

Set rs=conn.Execute("SHOW TABLES")
While Not rs.eof

Response.Write ""& rs.Fields(counter).value &"<br>"

rs.MoveNext
Wend

 

Det här funkar men jag vet inte var counter kommer ifrån, för den har jag inte sätt.

 

 

 

Länk till kommentar
Dela på andra webbplatser

Pröva att använda implicit skapade recordsets istället

 

Är detta den mindre resurskrävande varianten?

 

Set rs=conn.Execute("SHOW TABLES")

 

 

 

Länk till kommentar
Dela på andra webbplatser

Är detta den mindre resurskrävande varianten?

Precis. På det sättet skapas ett minimalt krävande objekt för hantering av den mottagna resultatmängden. En forward-only, icke-uppdaterbar statisk kopia av det du fått tillbaka från databasen, dvs det man oftast är intresserad av i webbmilöj.

 

Alltför många missbrukar (oftast pga dåliga webbtutorials därute) sättet att alltid skapa ett recordset-objekt utan att veta varför de gör det. Håll dig till min metod om du inte behöver använda paging-metoder eller har intresse av att kunna stega fritt fram och tillbaka i samma recordset.

 

Det här funkar men jag vet inte var counter kommer ifrån, för den har jag inte sätt.

Inte jag heller, det är ju din kod =) Men som jag förstått av vad SHOW TABLES returnerar så är det bara ett fält med tabellnamnen, så för dig räcker rs(0) för att få ut detta.

 

Länk till kommentar
Dela på andra webbplatser

Håll dig till min metod om du inte behöver använda paging-metoder eller har intresse av att kunna stega fritt fram och tillbaka i samma recordset.

 

Jag håller mig gärna till din resurssnåla metod. Menar du att man kan använda den i andra sammanhang också?

 

 

Länk till kommentar
Dela på andra webbplatser

Menar du att man kan använda den i andra sammanhang också?

I alla de situationer där du bara vill hämta data, loopa igenom dessa en efter en, så skall du använda denna metod. Vad du menar med "andra sammanhang" får du utveckla, det kan ju innebära vad som helst.

 

Länk till kommentar
Dela på andra webbplatser

Om vi går tillbaka till varför jag ville ta reda på vilka tabeller jag hade i databasen till och börja med, så var det för att om en viss tabell inte finns så ska den skapas.

Och då gör jag så här:

 

On error resume next
rs.Open "SELECT COUNT(*) AS ant FROM huvudmeny", Conn, 0, 3
antal=rs("ant")
rs.Close
If antal="" Then
Response.Redirect "skapa_huvudmeny.asp"
End If

 

Och det här är skapa_huvudmeny.asp

 

Set rs=conn.Execute("SHOW TABLES")
While Not rs.eof
If rs.Fields(i).value="huvudmeny" Then
sHuvud="hittat"
End If
rs.MoveNext
Wend
rs.Close

If sHuvud="" Then		'--- Skapa huvudmeny ---'
Conn.Execute "CREATE TABLE huvudmeny ... bla bla bla ..."
End If

 

Är det ett bra sätt, dvs resurssnålt, eller finns det bättre sätt?

 

 

[inlägget ändrat 2006-10-18 10:30:16 av Admini]

Länk till kommentar
Dela på andra webbplatser

Arkiverat

Det här ämnet är nu arkiverat och är stängt för ytterligare svar.

×
×
  • Skapa nytt...