Requête pour modifier la colonne à nullabe ne fonctionne pas

J'ai besoin de faire de colonne appelle start_date_data_id pour accepter les valeurs null.

J'ai trouvé cette réponse(modification d'une colonne à nullable) et essayé de le faire sur la façon décrite.

Description de la colonne: (| start_date_data_id| bigint(20)| NO | MUL | NULL | |).

Requête:

ALTER TABLE attenddb.company_group_user_settings
    ALTER COLUMN start_date_data_id bigint(20) NULL;

Erreur:

ERROR 1064 (42000): 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 'bigint(20) NULL' at line 1

Quelqu'un peut me dire pourquoi il ne fonctionne pas?

-2
2019-09-17 12:12:54
source
2 réponses

Le premier problème avec votre code est:

int i,j,k=1,...

...

while (k>=2000,k++)
        ^^^^^^
        ups...

Cela permettra de donner l'alerte "de gauche opérande de virgule expression n'a pas d'effet", ce qui signifie que la ligne est la même que:

while (k++)

Qui va garder boucle jusqu'à ce que vous avez débordement d'entier (ce qui est un comportement indéfini). Si vous ne voulez pas le faire.

Depuis l'initialisation de k à 1, je suppose que tu voulais faire:

while (k++ < 2000)

Maintenant, supposons que vous voulez:

while (k++ < 2000)  // Will loop approx 2000 times
{
    //Scanner Input
    for(i=0; i< ArrSize; i++)  // Will loop 2000 times
    {
        scanf("%%d",&arr[i]);
    }

Donc à la fin de votre programme appelle scanf 2000 x 2000 = 4.000.000 fois. Est-ce que vous voulez? Le but de l'extérieur de while n'est pas claire.

Votre programme de lit pour la première fois en 2000 entiers et par la suite, il semble que vous voulez supprimer les doublons. C'est une mauvaise approche que vous risquez de vous faire beaucoup de mémoire déplacer chaque fois que vous avez besoin de supprimer un doublon élément du tableau.

Une meilleure approche consiste à vérifier si une nouvelle valeur numérisée est un doublon avant de l'insérer dans le tableau. Qui pourrait ressembler à quelque chose comme:

    for(i=0; i < ArrSize; )
    {
        int tmp;
        if (scanf("%%d", &tmp) != 1) 
        {
            // Input error
            exit(1);
        }

        // Check if tmp is already in the array
        int duplicate = 0;
        for (int j = 0; j < i; ++j)
        {
            if (tmp == arr[j])
            {
                duplicate = 1;
                break;
            }
        }
        if (duplicate)
        {
            printf("dup found\n");
        }
        else
        {
            arr[i] = tmp;
            ++i;
        }
    }

Cela devrait vous donner des ArrSize des éléments uniques.

Avis: afin de vérifier si quelque chose est un doublon, vous aurez besoin de numériser à travers la matrice du début à la le nombre actuel d'éléments. Pour améliorer les performances, vous pourriez envisager une autre approche, par exemple, triés arbre, tables de hachage, etc, de sorte que contrôler les doublons peut être fait beaucoup plus rapidement. Ceci devient plus important que le nombre d'éléments du tableau d'augmenter.

+1
2019-09-17 12:20:26

Donc la moitié du problème est résolu, je ne suis toujours pas sûr de savoir comment puis-je augmenter le pointeur à la position suivante, donc sur la boucle suivante, il va enregistrer un autre numéro de code-barres qui sera ensuite transmis à la double checker pour vérifier puis répéter la boucle pour le prochain scan.

#include <stdio.h>
#include <stdlib.h>

int main(void) {

int i,j,k=1,arr[2000],counter=1;
//Welcome message
  printf("Welcome to Yamato Transport (S) Pte. Ltd.\n");
  printf("Barcode checker Ver 1.0\n");

  while (k++ < 2000)  // Will loop approx 2000 times
{
//Scanner Input
printf("Scan barcode\n");
for(i=0; i< counter; i++)  // Will loop 1 time
{
    scanf("%%d",&arr[i]);
}

  //check for duplicates
  for(i=0; i < counter; )
    {
        int tmp;
        if (scanf("%%d", &tmp) != 1) 
        {
            // Input error
            exit(1);
        }

        // Check if tmp is already in the array
        int duplicate = 0;
        for (int j = 0; j < i; ++j)
        {
            if (tmp == arr[j])
            {
                duplicate = 1;
                break;
            }
        }
        if (duplicate)
        {
            printf("Duplicate Barcode\n");
        }
        else
        {
            arr[i] = tmp;
            ++i;
        }
    }

  }
  return 0;
}
+1
2019-09-17 12:20:26

Voir d'autres questions sur les étiquettes